![Most](/images/patterns/cards/bridge-mini.png?id=b389101d8ee8e23ffa1b534c704d0774)
Most w języku Go
Most jest strukturalnym wzorcem projektowym zakładającym podział logiki biznesowej lub dużej klasy na osobne hierarchie klas które następnie można rozwijać niezależnie od siebie.
Jedna z takich hierarchii (zwana często Abstrakcją) posiada referencję do obiektu drugiej hierarchii (zwanej Implementacją) i deleguje mu część (czasem większość) wywołań. Ponieważ wszystkie implementacje mają wspólny interfejs, z punktu widzenia abstrakcji są wymienialne.
Przykład koncepcyjny
Przypuśćmy, że mamy dwa rodzaje komputerów: Mac i Windows, a do tego dwa rodzaje drukarek: Epson i HP. Każdy z komputerów powinien móc współdziałać z każdą z drukarek w dowolnej kombinacji. Klient nie chce martwić się szczegółami łączenia ze sobą komputerów i drukarek.
Nie chcemy aby kod rósł wykładniczo gdy przyjdzie pora kupić nowe drukarki. Zamiast tworzyć cztery struktury z myślą o tej kombinacji 2*2, tworzymy dwie hierarchie:
- Hierarchia abstrakcyjna: nasze komputery,
- Hierarchia implementacyjna: nasze drukarki.
Obie hierarchie będą komunikować się ze sobą za pośrednictwem Mostu, gdzie Abstrakcja (komputer) będzie posiadała odniesienie do Implementacji (drukarka). Zarówno abstrakcję, jak i implementację można wówczas rozwijać niezależnie.
computer.go: Abstrakcja
package main
type Computer interface {
Print()
SetPrinter(Printer)
}
mac.go: Wzbogacona abstrakcja
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: Wzbogacona abstrakcja
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: Implementacja
package main
type Printer interface {
PrintFile()
}
epson.go: Konkretna implementacja
package main
import "fmt"
type Epson struct {
}
func (p *Epson) PrintFile() {
fmt.Println("Printing by a EPSON Printer")
}
hp.go: Konkretna implementacja
package main
import "fmt"
type Hp struct {
}
func (p *Hp) PrintFile() {
fmt.Println("Printing by a HP Printer")
}
main.go: Kod klienta
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: Wynik działania
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