🎉 Hooray! After 3 years of work, I've finally released the ebook on design patterns! Check it out »
Adapter

Adapter in Go

Adapter is a structural design pattern, which allows incompatible objects to collaborate.

The Adapter acts as a wrapper between two objects. It catches calls for one object and transforms them to format and interface recognizable by the second object.

Conceptual Example

We have a client code that expects some features of an object (Lightning port), but we have another object called adaptee (Windows laptop) which offers the same functionality but through a different interface (USB port)

This is where the Adapter pattern comes into the picture. We create a struct type known as adapter that will:

  • Adhere to the same interface which the client expects (Lightning port).

  • Translate the request from the client to the adaptee in the form that the adaptee expects. The adapter accepts a Lightning connector and then translates its signals into a USB format and passes them to the USB port in windows laptop.

client.go: Client code

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: Client interface

package main

type computer interface {
	insertIntoLightningPort()
}

mac.go: Service

package main

import "fmt"

type mac struct {
}

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

windows.go: Unknown service

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: Execution result

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.

Adapter in Other Languages

Design Patterns: Adapter in Java Design Patterns: Adapter in C# Design Patterns: Adapter in C++ Design Patterns: Adapter in PHP Design Patterns: Adapter in Python Design Patterns: Adapter in Ruby Design Patterns: Adapter in Swift Design Patterns: Adapter in TypeScript