Нужна клёвая книга о паттернах на русском? Вот она »
Адаптер

Адаптер на Go

Адаптер — это структурный паттерн, который позволяет подружить несовместимые объекты.

Адаптер выступает прослойкой между двумя объектами, превращая вызовы одного в вызовы понятные другому.

Концептуальный пример

Мы имеем код клиента, ожидающий определенных от объекта определенных качеств (порт Lightning), но также мы имеем другой объект под названием adaptee (ноутбук на Windows), который предоставляет тот же функционал, но через другой интерфейс (USB порт).

В такой ситуации нам подойдет паттерн Адаптер. Мы создадим структуру adapter, которая будет:

  • Реализовать тот же интерфейс, который ожидает клиент (порт Lightning).

  • Переводить запрос от клиента к адаптируемому объекту в форме, которую он ожидает. Адаптер принимает коннектор Lightning, после чего переводит его сигналы в формат USB в ноутбуке на Windows.

client.go: Клиентский код

package main

import "fmt"

type client struct {
}

func (c *client) insertLightningConnectorIntoComputer(com computer) {
    fmt.Println("Client inserts Lightning connector into computer.")
	com.insertIntoLightningPort()
}

computer.go: Интерфейс клиента

package main

type computer interface {
	insertIntoLightningPort()
}

mac.go: Сервис

package main

import "fmt"

type mac struct {
}

func (m *mac) insertIntoLightningPort() {
	fmt.Println("Lightning connector is plugged into mac machine.")
}

windows.go: Неизвестный сервис

package main

import "fmt"

type windows struct{}

func (w *windows) insertIntoUSBPort() {
	fmt.Println("USB connector is plugged into windows machine.")
}

windowsAdapter.go: Адаптер

package main

import "fmt"

type windowsAdapter struct {
	windowMachine *windows
}

func (w *windowsAdapter) insertIntoLightningPort() {
    fmt.Println("Adapter converts Lightning signal to USB.")
	w.windowMachine.insertIntoUSBPort()
}

main.go

package main

func main() {

	client := &client{}
	mac := &mac{}

	client.insertLightningConnectorIntoComputer(mac)

	windowsMachine := &windows{}
	windowsMachineAdapter := &windowsAdapter{
		windowMachine: windowsMachine,
	}

	client.insertLightningConnectorIntoComputer(windowsMachineAdapter)
}

output.txt: Результат выполнения

Client inserts Lightning connector into computer.
Lightning connector is plugged into mac machine.
Client inserts Lightning connector into computer.
Adapter converts Lightning signal to USB.
USB connector is plugged into windows machine.
По материалам: Golang By Example

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

Адаптер на Java Адаптер на C# Адаптер на C++ Адаптер на PHP Адаптер на Python Адаптер на Ruby Адаптер на Swift Адаптер на TypeScript