Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!
Мост

Мост на 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

Мост на других языках программирования

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