본문 바로가기

golang37

golang design pattern #8 Decorator Decorator 패턴은 기존의 기능은 건드리지 않고 wrapping을 하는 것입니다. go에서는 구조체 composition을 이용하여 이 패턴을 구현할 수 있습니다. 검색을 해보았을 때 피자 예제가 가장 좋은 것 같아서 이를 예시로 설명하겠습니다. 피자의 경우 제일 기본 피자를 시킨 후 여러가지 토핑을 추가할 수 있습니다. 이 때 토핑을 추가하는 것은 기존 피자는 건드리지 않고 정말 토핑만 추가하게 됩니다. (토핑을 추가한다고 기존 피자의 재료를 바꾸거나 하지는 않는다는 뜻입니다.) 예제 코드에서는 토핑마다 가격이 다를 것이므로 각 토핑을 추가할때마다 토핑에 맞는 가격이 추가되는 예제를 구현해보겠습니다. 1 2 3 type pizza interface { getPrice() int } cs 우선 pi.. 2021. 11. 13.
golang design pattern #7 Composite Composite 패턴은 어떤 object가 있을 때 해당 object의 group과 단일 object를 똑같이 다루고 싶을 때 사용됩니다. 이러한 composite 패턴 사용시 Tree 구조가 되기 때문에 재귀적인 코드가 사용되게 됩니다. 파일/폴더 구조를 예시로 들어보자면 둘다 find라는 메서드가 필요할 수 있습니다. 폴더에서의 search는 폴더내에 있는 파일들을 순환하면서 탐색하는 메서드일 것이고 파일에서의 search는 파일내의 내용을 찾아보는 것일 겁니다. 그런데 폴더안에는 또 다른 폴더가 들어갈 수 있으므로 재귀적인 형태가 되어야합니다. 이런 상황에서 Composite 패턴을 적용시켜보겠습니다. 1 2 3 type component interface { search(string) } cs .. 2021. 11. 12.
golang design pattern #6 Bridge Bridge 패턴은 두 구현체 간의 결합을 제거하기 위해 (decoupling) 사용되는 패턴입니다. 이 패턴의 예제로 컴퓨터와 프린트기의 예제가 많이 사용됩니다. mac과 windows 컴퓨터가 있고 삼성 프린트기와 HP 프린트기가 있다고 가정해봅시다. 컴퓨터의 종류가 2가지고 프린트기의 종류가 2가지이므로 제일 단순한 방법은 2*2=4 즉, 4개의 구조체를 만드는 것입니다. 1 2 3 4 5 6 7 type MacWithSamsungPrinter struct {} type MacWithHpPrinter struct {} type WindowWithSamsungPrinter struct {} type WindowWithHpPrinter struct {} cs 위처럼 말입니다. 이렇게 하면 상당히 번거롭.. 2021. 11. 12.
golang design pattern #5 Adapter Adapter 패턴은 어댑터라는 말 그대로 서로 다른 구조체간의 연결을 하기 위한 패턴으로 interface를 활용하여 연결하게 됩니다. golang의 http 관련 내부 패키지중에 HandlerFunc라는 타입이 있는데 HandlerFunc가 어댑터 패턴으로 구현되어 있습니다. 1 2 3 4 5 type HandlerFunc func(ResponseWriter, *Request) func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) } Colored by Color Scripter cs go에 기본적으로 구현되어 있는 HandlerFunc의 코드입니다. 보다시피 HandlerFunc 타입은 ServeHTTP 메서드를 구현하고 있습.. 2021. 11. 12.