![브리지](/images/patterns/cards/bridge-mini.png?id=b389101d8ee8e23ffa1b534c704d0774)
Go로 작성된 브리지
브리지는 구조 디자인 패턴입니다. 이 패턴은 비즈니스 로직 또는 거대한 클래스를 독립적으로 개발할 수 있는 별도의 클래스 계층구조들로 나눕니다.
종종 추상화라고 불리는 이러한 계층구조 중 하나는 두 번째 계층구조의 객체(구현)에 대한 참조를 얻습니다. 추상화의 호출들 일부(때로는 대부분)를 구현 객체에 위임할 수 있습니다. 모든 구현은 공통 인터페이스를 가지므로 추상화 내에서 상호 교환할 수 있습니다.
개념적인 예시
맥과 윈도우 유형의 두 컴퓨터 유형이 있다고 가정해 봅시다. 또한 엡손과 HP 유형의 두 프린터 유형이 있다고 가정해 봅시다. 컴퓨터와 프린터 유형들은 모든 조합으로 서로 작동해야 합니다. 클라이언트는 프린터와 컴퓨터를 연결하는 세부 사항에 대하여 걱정하고 싶어 하지 않습니다.
또 우리는 새 프린터를 도입할 때 코드가 기하급수적으로 증가하는 것을 원하지 않습니다. 따라서 2*2 조합에 대해 4개의 구조체를 만드는 대신 우리는 두 개의 계층구조를 만듭니다.
- 추상화 계층구조: 이것은 우리의 컴퓨터가 될 것입니다.
- 구현 계층구조: 이것은 우리의 프린터가 될 것입니다.
이 두 계층구조는 브리지를 통해 서로 통신하며, 여기서 추상화(컴퓨터)에는 구현(프린터)에 대한 참조가 포함됩니다. 추상화와 구현은 서로 영향을 미치지 않고 독립적으로 개발될 수 있습니다.
computer.go: 추상화
package main
type Computer interface {
Print()
SetPrinter(Printer)
}
mac.go: 정제된 추상화
package main
import "fmt"
type Mac struct {
printer Printer
}
func (m *Mac) Print() {
fmt.Println("Print request for mac")
m.printer.PrintFile()
}
func (m *Mac) SetPrinter(p Printer) {
m.printer = p
}
windows.go: 정제된 추상화
package main
import "fmt"
type Windows struct {
printer Printer
}
func (w *Windows) Print() {
fmt.Println("Print request for windows")
w.printer.PrintFile()
}
func (w *Windows) SetPrinter(p Printer) {
w.printer = p
}
printer.go: 구현
package main
type Printer interface {
PrintFile()
}
epson.go: 구상 구현
package main
import "fmt"
type Epson struct {
}
func (p *Epson) PrintFile() {
fmt.Println("Printing by a EPSON Printer")
}
hp.go: 구상 구현
package main
import "fmt"
type Hp struct {
}
func (p *Hp) PrintFile() {
fmt.Println("Printing by a HP Printer")
}
main.go: 클라이언트 코드
package main
import "fmt"
func main() {
hpPrinter := &Hp{}
epsonPrinter := &Epson{}
macComputer := &Mac{}
macComputer.SetPrinter(hpPrinter)
macComputer.Print()
fmt.Println()
macComputer.SetPrinter(epsonPrinter)
macComputer.Print()
fmt.Println()
winComputer := &Windows{}
winComputer.SetPrinter(hpPrinter)
winComputer.Print()
fmt.Println()
winComputer.SetPrinter(epsonPrinter)
winComputer.Print()
fmt.Println()
}
output.txt: 실행 결과
Print request for mac
Printing by a HP Printer
Print request for mac
Printing by a EPSON Printer
Print request for windows
Printing by a HP Printer
Print request for windows