본문 바로가기
golang/design pattern

golang design pattern #6 Bridge

by PudgeKim 2021. 11. 12.

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

위처럼 말입니다.

이렇게 하면 상당히 번거롭고 유연하지도 않기 때문에 Bridge 패턴을 적용해보겠습니다.

 

1
2
3
4
5
6
7
8
9
type printer interface {
    printFile()
}
 
 
type computer interface {
    print()
    setPrint(print)
}
cs

위처럼 2가지 interface를 만듭니다.

 

1
2
3
4
5
6
7
8
9
10
11
type samsungPrinter struct {}
 
func (p *samsungPrinter) printFile() {
    fmt.Println("Printing by a samsung..")
}
 
type hpPrinter struct {}
 
func (p *HpPrinter) printFile() {
    fmt.Println("Printing by a hp..")
}
cs

그럼 삼성 프린트기와 HP 프린트기는 위처럼 나타낼 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type mac struct {
    printer printer
}
 
func (m *mac) print() {
    fmt.Println("Print in mac")
    m.printer.printFile()
}
 
func (m *mac) setPrinter(p printer) {
    m.printer = p
}
 
 
 
type windows struct {
    printer printer
}
 
func (w *windows) print() {
    fmt.Println("Print in windows")
    w.printer.printFile()
}
 
func (w *windows) setPrinter(p printer) {
    w.printer = p
}
cs

mac과 windows는 위처럼 나타낼 수 있습니다.

중요한 점은 mac과 windows 구조체는 필드에 printer 인터페이스 타입을 가지고 있습니다.

그렇기 때문에 프린트기를 동작시킬 수 있으며 printer의 인터페이스 타입만 만족시킨다면
어떤 프린트기든 동작시킬 수 있습니다.

상당히 유연한 구조가 되었습니다.

'golang > design pattern' 카테고리의 다른 글

golang design pattern #8 Decorator  (0) 2021.11.13
golang design pattern #7 Composite  (0) 2021.11.12
golang design pattern #5 Adapter  (0) 2021.11.12
golang design pattern #4 Singleton  (0) 2021.11.11
golang design pattern #3 Prototype  (0) 2021.11.11