Pada kehidupan sehari-hari, tentu Anda sudah sering berurusan dengan adapter. Contohnya kabel charger ponsel menggunakan US plug, sementara, socket dirumah menggunakan UK plug. Diperlukan adapter agar bisa men-charge ponsel tersebut.
Demikian juga dalam dunia software, konsep adapter adalah structural design pattern yang memungkinkan object dengan interface yang berbeda dapat berkolaborasi.
Contoh aplikasi untuk monitoring stock market. Aplikasi mendapatkan data dalam format XML. Misalnya, Anda menambahkan fitur baru dari library pihak ketiga untuk melakukan analisis, namun library tersebut membutuhkan format JSON.
Solusi
Digunakan adapter, object khusus untuk melakukan konversi interface dari suatu object agar dapat dipahami oleh object lainnya.
Adapter akan membungkus suatu object untuk menghindari kompleksitas proses konversi.
Adapters tidak hanya melakukan konversi format data saja, namun bisa digunakan untuk kolaborasi antar object dengan interface yang berbeda.
Jadi untuk masalah aplikasi stock market diatas, kita dapat buat XML-to-JSON adapters untuk setiap class dari librari pihak ketiga yang digunakan.
Berikut contoh penggunaan Adapter dalam Go.
Terdapat kode klien yang mengharapkan fitur dari suatu objek (port Lightning), namun terdapat objek lain yang disebut adaptee (laptop Windows) yang memiliki fungsionalitas yang sama tetapi melalui antarmuka yang berbeda (port USB)
Di sinilah pola Adaptor digunakan. Kita buat tipe struct yang akan:
- Memiliki Antarmuka yang sama yang diharapkan klien (Lightning port).
- Menterjemahkan permintaan dari klien ke adaptee dalam bentuk yang diharapkan adaptee. Adaptor menerima konektor Lightning Port, kemudian menerjemahkan sinyalnya ke dalam format USB dan meneruskannya ke port USB di laptop windows.
package main import "fmt" //client type client struct { } func (c *client) insertLightningConnectorIntoComputer(com computer) { fmt.Println("Client inserts Lightning connector into computer.") com.insertIntoLightningPort() } //client interface type computer interface { insertIntoLightningPort() } //service type mac struct { } func (m *mac) insertIntoLightningPort() { fmt.Println("Lightning connector is plugged into mac machine.") } //unknown service type windows struct{} func (w *windows) insertIntoUSBPort() { fmt.Println("USB connector is plugged into windows machine.") } //adapter type windowsAdapter struct { windowMachine *windows } func (w *windowsAdapter) insertIntoLightningPort() { fmt.Println("Adapter converts Lightning signal to USB.") w.windowMachine.insertIntoUSBPort() } 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.
source: https://refactoring.guru/