Structural Design Pattern: Bridge

Pengenalan

Pattern bridge adalah pola desain struktural yang memungkinkan Anda membagi kelas besar atau sekumpulan kelas yang terkait erat menjadi dua hierarki terpisah—abstraksi dan implementasi—yang dapat dikembangkan secara independen satu sama lain.

Bertujuan untuk mengatasi masalah cartesian product complexity explosion. Contoh:

Katakanlah Anda memiliki kelas Bentuk geometris dengan subkelas: Circle dan Square. Anda ingin memperluas hierarki kelas ini dengan menambahkan Color, jadi Anda berencana untuk membuat subkelas bentuk Red dan Blue. Namun, karena sebelumnya sudah memiliki dua subkelas, Anda harus membuat empat kombinasi kelas seperti BlueCircle dan RedSquare.

Menambahkan tipe dan warna bentuk baru ke hierarki akan menumbuhkannya secara eksponensial. Misalnya, untuk menambahkan bentuk Triangle, Anda perlu memperkenalkan dua subkelas, satu untuk setiap Color. Dan setelah itu, menambahkan warna baru akan membutuhkan pembuatan tiga subkelas, satu untuk setiap jenis bentuk. Semakin jauh kita pergi, semakin buruk jadinya.

Solusi

Masalah ini terjadi karena contoh diatas mencoba memperluas kelas secara independen: menurut shape dan color. Masalah yang sangat umum dengan pewarisan kelas.

Pola Bridge mencoba memecahkan masalah ini dengan beralih dari pewarisan ke komposisi objek. Artinya, Anda mengekstrak salah satu dimensi ke dalam hierarki kelas yang terpisah, sehingga kelas asli akan mereferensikan objek hierarki baru, alih-alih memiliki semua status dan perilakunya dalam satu kelas.

Dengan pendekatan ini, kita dapat mengekstrak kode terkait Color ke dalam kelasnya sendiri dengan dua subkelas: Red dan Blue. Kelas Shape kemudian mendapatkan referensi yang berkaitan dengan warna dengan menunjuk objek Color.

Sekarang object Shape dapat mendelegasikan hal terkait warna apa pun ke objek Coor yang ditautkan. Referensi akan bertindak sebagai jembatan antara kelas Shape dan Color.

Mulai sekarang, menambahkan warna baru tidak perlu mengubah hierarki Shape, dan sebaliknya.

Berikut contoh implementasi bridge dengan skenario terdapat 2 tipe komputer, Mac dan Windows. Serta 2 tipe printer Epson dan HP. Baik komputer dan printer harus bekerja dengan baik dengan semua kombinasi.

Jika dikemudian hari, ada jenis printer baru, kita tidak mengharapkan kode menjadi berkembang besar. Oleh karena itu kita gunakan 2 hirarki

  • Abstraction hierarchy: untuk computers
  • Implementation hierarchy: untuk printers

Kedua hirarki ini dapat berkomunikasi satu sama lain melalui Bridge, dimana Abstraction (computer) memiliki referensi ke Implementation (printer). Abstraction dan implementation dapat didevelop secara independent.

package main

import "fmt"

//Abstraction
type computer interface {
	print()
	setPrinter(printer)
}

//Refined abstraction
type mac struct {
	printer printer
}

func (m *mac) print() {
	fmt.Println("Print request for mac")
	m.printer.printFile()
}

func (m *mac) setPrinter(p printer) {
	m.printer = p
}

//Refined abstraction
type windows struct {
	printer printer
}

func (w *windows) print() {
	fmt.Println("Print request for windows")
	w.printer.printFile()
}

func (w *windows) setPrinter(p printer) {
	w.printer = p
}

//Implementation
type printer interface {
	printFile()
}

//concrete implementation
type epson struct {
}

func (p *epson) printFile() {
	fmt.Println("Printing by a EPSON Printer")
}

//concrete implementation
type hp struct {
}

func (p *hp) printFile() {
	fmt.Println("Printing by a HP Printer")
}

func main() {

	hpPrinter := &hp{}
	epsonPrinter := &epson{}

	macComputer := &mac{}

	macComputer.setPrinter(hpPrinter)
	macComputer.print()
	fmt.Println()

	macComputer.setPrinter(epsonPrinter)
	macComputer.print()
	fmt.Println()

	winComputer := &windows{}

	winComputer.setPrinter(hpPrinter)
	winComputer.print()
	fmt.Println()

	winComputer.setPrinter(epsonPrinter)
	winComputer.print()
	fmt.Println()
}
Print request for mac
Printing by a HP Printer

Print request for mac
Printing by a EPSON Printer

Print request for windows
Printing by a HP Printer

Print request for windows
Printing by a EPSON Printer

source: https://refactoring.guru/

Sharing is caring:

Leave a Comment