![Bridge](/images/patterns/cards/bridge-mini.png?id=b389101d8ee8e23ffa1b534c704d0774)
Bridge を Go で
Bridge は、 構造に関するデザインパターンの一つで、 ビジネス・ロジックや巨大なクラスを独立して開発可能なクラス階層に分割します。
階層の一つ (抽象化と呼ばれる) は、 二つ目の階層 (実装) のオブジェクトへの参照を持ちます。 抽象化階層は、 その呼び出しのいくつか (場合によっては大多数) を実装階層のオブジェクトに委任します。 すべての実装は、 共通のインターフェースを持っているので、 抽象化の中で入れ替え可能です。
概念的な例
ここに 2 種類のコンピューターがあるとします。 Mac と Windows です。 そして、 2 種類のプリンターがあるとします。 Epson と 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