봄맞이 세일
브리지

Go로 작성된 브리지

브리지는 구조 디자인 패턴입니다. 이 패턴은 비즈니스 로직 또는 거대한 클래스를 독립적으로 개발할 수 있는 별도의 클래스 계층구조들로 나눕니다.

종종 추상화라고 불리는 이러한 계층구조 중 하나는 두 번째 계층구조의 객체​(구현)​에 대한 참조를 얻습니다. 추상화의 호출들 일부​(때로는 대부분)​를 구현 객체에 위임할 수 있습니다. 모든 구현은 공통 인터페이스를 가지므로 추상화 내에서 상호 교환할 수 있습니다.

개념적인 예시

맥과 윈도우 유형의 두 컴퓨터 유형이 있다고 가정해 봅시다. 또한 엡손과 HP 유형의 두 프린터 유형이 있다고 가정해 봅시다. 컴퓨터와 프린터 유형들은 모든 조합으로 서로 작동해야 합니다. 클라이언트는 프린터와 컴퓨터를 연결하는 세부 사항에 대하여 걱정하고 싶어 하지 않습니다.

또 우리는 새 프린터를 도입할 때 코드가 기하급수적으로 증가하는 것을 원하지 않습니다. 따라서 2*2 조합에 대해 4개의 구조체를 만드는 대신 우리는 두 개의 계층구조를 만듭니다.

  • 추상화 계층구조: 이것은 우리의 컴퓨터가 될 것입니다.
  • 구현 계층구조: 이것은 우리의 프린터가 될 것입니다.

이 두 계층구조는 브리지를 통해 서로 통신하며, 여기서 추상화​(컴퓨터)​에는 구현​(프린터)​에 대한 참조가 포함됩니다. 추상화와 구현은 서로 영향을 미치지 않고 독립적으로 개발될 수 있습니다.

computer.go: 추상화

package main

type Computer interface {
	Print()
	SetPrinter(Printer)
}

mac.go: 정제된 추상화

package main

import "fmt"

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
}

windows.go: 정제된 추상화

package main

import "fmt"

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
}

printer.go: 구현

package main

type Printer interface {
	PrintFile()
}

epson.go: 구상 구현

package main

import "fmt"

type Epson struct {
}

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

hp.go: 구상 구현

package main

import "fmt"

type Hp struct {
}

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

main.go: 클라이언트 코드

package main

import "fmt"

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()
}

output.txt: 실행 결과

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

다른 언어로 작성된 브리지

C#으로 작성된 브리지 C++로 작성된 브리지 자바로 작성된 브리지 PHP로 작성된 브리지 파이썬으로 작성된 브리지 루비로 작성된 브리지 러스트로 작성된 브리지 스위프트로 작성된 브리지 타입스크립트로 작성된 브리지