Friend spotlight!
Whimsical Animations course
Friend spotlight!
NEW Whimsical Animations course
Friend spotlight! NEW Whimsical Animations course
huge discount only this week
Friend spotlight! Want to make your project stand out? NEW Whimsical Animations course huge discount only this week
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

Most w innych językach

Most w języku C# Most w języku C++ Most w języku Java Most w języku PHP Most w języku Python Most w języku Ruby Most w języku Rust Most w języku Swift Most w języku TypeScript