Hej, właśnie obniżyłem ceny wszystkich produktów. Przygotujmy nasze umiejętności programowania na erę post-COVID. Więcej szczegółów »
Most

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
Na podstawie: Golang By Example

Most w innych językach

Wzorce projektowe: Most w języku Java Wzorce projektowe: Most w języku C# Wzorce projektowe: Most w języku C++ Wzorce projektowe: Most w języku PHP Wzorce projektowe: Most w języku Python Wzorce projektowe: Most w języku Ruby Wzorce projektowe: Most w języku Swift Wzorce projektowe: Most w języku TypeScript