Wiosenna WYPRZEDAŻ
Adapter

Adapter w języku Go

Adapter to strukturalny wzorzec projektowy pozwalający na współpracę niekompatybilnych obiektów ze sobą.

Adapter pełni rolę opakowania dwóch obiektów. Przechwytuje wywołania jednego z obiektów i przekształca je na format i interfejs zrozumiały dla drugiego obiektu.

Przykład koncepcyjny

Mamy kod klienta który oczekuje pewnej funkcjonalności od obiektu (port Lightning) oraz kolejny obiekt zwany adaptee (laptop Windows) oferujący tę samą funkcjonalność za pośrednictwem innego interfejsu (przez port USB).

Można tu skorzystać ze wzorca Adapter. Zaczniemy od stworzenia struktury znanej jako adapter która:

  • Będzie zgodna z interfejsem jakiego oczekują klienci (port Lightning).

  • Przetłumaczy żądania od klienta do postaci zrozumiałej dla obiektu wyposażonego w ów adapter. Adapter przyjmuje wtyk typu Lightning, po czym tłumaczy otrzymywane sygnały do formatu USB i przekazuje je portowi USB w laptopie Windows.

client.go: Kod klienta

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: Interfejs klienta

package main

type Computer interface {
	InsertIntoLightningPort()
}

mac.go: Usługa

package main

import "fmt"

type Mac struct {
}

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

windows.go: Nieznana usługa

package main

import "fmt"

type Windows struct{}

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

windowsAdapter.go: Adapter

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: Wynik działania

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

Adapter w innych językach

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