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 |