Adapter Pattern

한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.

코드 출처: https://refactoring.guru/design-patterns/adapter/go/example

윈도우에는 USB, 맥북에는 thunderbolt 포트가 있다. 윈도우 PC에 thunderbolt포트를 연결하기 위해 adapter가 필요하다

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.")
}

window.go

package main

import "fmt"

type windows struct{}

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

windowAdapter.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)
}

실행 결과

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.