Потрібна крута книжка про патерни та ще й українською? Ось вона »
Міст

Міст на Go

Міст — це структурний патерн, який розділяє бізнес-логіку або великий клас на кілька окремих ієрархій, які можна розвивати далі окремо одну від одної.

Одна з цих ієрархій (абстракція) отримає посилання на об’єкти іншої ієрархії (реалізація) і буде делегувати їм основну роботу. Завдяки тому, що всі реалізації будуть дотримуватись спільного інтерфейсу, їх можна буде взаємозамінювати всередині абстракції.

Концептуальний приклад

Уявімо, що у вас є два типи комп’ютерів: Mac і Windows, а також два типи принтерів: Epson і HP. Комп’ютери та принтери мусять працювати між собою у будь-яких комбінаціях. Клієнт не хоче думати про особливості підключення принтерів до комп’ютерів.

Ми не хочемо, щоб при введенні в цю систему нових принтерів кількість коду збільшувалася по експоненті. Замість створення чотирьох структур для 2 × 2 комбінацій, ми створимо дві ієрархії:

  • Ієрархія абстракції: сюди будуть входити наші комп’ютери
  • Ієрархія реалізації: сюди будуть входити наші принтери

Ці дві ієрархії спілкуються між собою за допомогою Моста, в якому Абстракція (комп’ютер) містить посилання на Реалізацію (принтер). І абстракцію, і реалізацію можна розробляти окремо, не впливаючи одне на одного.

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
На основі: Golang By Example

Міст іншими мовами програмування

Міст на Java Міст на C# Міст на C++ Міст на PHP Міст на Python Міст на Ruby Міст на Swift Міст на TypeScript