브릿지 패턴 🌉
코드에 여러 접선 기능이 있는 클래스가 있을 때 일반적으로 이 방법이 사용되는 것을 볼 수 있습니다. 이러한 경우 기능을 더 작은 클래스로 분할하고 이를 연결하는 메커니즘(브리지, 아마도?)을 구축하는 것이 좋습니다.
더 잘 이해하기 위해 예를 살펴 보겠습니다.
This tutorial uses go. You can find the implementation here. However, if you read through it, I'm confident that you will be able to implement it in any programming language 🤗
직원 관리 시스템
직장에 직원 관리 시스템이 필요하다고 가정합니다. 이 요구 사항의 일부로 인력을 성별 및 기능/부서별로 분류해야 합니다.
현재 귀하의 성별 및 부서는 다음과 같습니다.
성별
부서
이 문제에 접근하는 순진한 방법은
MaleDeveloper
, FemaleDeveloper
, MalePM
, FemalePM
등과 같은 여러 구조체를 구현하는 것입니다. 성별 및 부서 집합을 이미 정의한 경우 괜찮습니다. 그러나 현실적으로는 결코 그렇지 않습니다.우리는 항상 더 많은 기능을 포함하도록 부서를 성장시킬 수 있으며 항상 논바이너리로 식별하는 직원을 온보딩할 수 있습니다(무식하지 말자 🏳️🌈). 그러면 발생하는 문제는 우리가 온보딩하는 모든 새로운 젠더에 대해 3개의 새 구조체를 만들어야 한다는 것입니다. 새 젠더와 기존 부서의 각 조합에 대해 하나씩입니다.
이 숫자는 우리 조직이 성장함에 따라 증가할 것이며 이러한 구조체를 유지하는 것은 악몽이 될 것입니다 😨
Note: Go does not have classes. Structs are a way of implementing classes in golang. If you're working with another programming language, think
classes
every time I saystructs
브릿지 패턴을 입력합니다. Bridge 패턴에 따르면 구조체의 다른 차원을 별도의 하위 구조체로 분리해야 합니다. 이 경우 각 성별에 대해 별도의 구조체가 있고 각 부서에 대해 별도의 구조체가 있습니다.
다음을 살펴보겠습니다.
type Gender interface {
describePerson() string
}
type Department interface {
getDepartmentName() string
}
이제 두 개의 인터페이스가 정의되었으므로 미래의 모든 부서/성별에서 이를 구현할 것으로 예상할 수 있습니다. 그러나 현재 다음 인터페이스를 사용하여 알고 있는 기존 구조체를 구현해 보겠습니다.
// male.go
type Male struct {
name string
age int
department Department
}
func (m *Male) describePerson() string {
description := fmt.Sprintf("%s is a %d years old man\n", m.name, m.age)
description = description + fmt.Sprintf("He works in the %s department", m.department.getDepartmentName())
return description
}
// female.go
type Female struct {
name string
age int
department Department
}
func (f *Female) describePerson() string {
description := fmt.Sprintf("%s is a %d years old woman\n", f.name, f.age)
description = description + fmt.Sprintf("She works in the %s department", f.department.getDepartmentName())
return description
}
// departments.go
type Developer struct { }
type PM struct { }
type HR struct { }
func(d Developer) getDepartmentName() string {
return "software development"
}
func (pm PM) getDepartmentName() string {
return "product management"
}
func (hr HR) getDepartmentName() string {
return "human resources"
}
보시다시피 성별과 부서별로 기능을 성공적으로 분리했습니다. 그러나 두 성별 구조체 모두에
department
키가 있습니다. 이 핵심은 사실 성별과 부서라는 두 가지 차원 사이의 다리입니다.이제 새로운 성별이나 부서를 생성해야 할 때마다 하나의 추가 클래스만 생성하면 브리지가 나머지를 처리합니다.
코드를 테스트할 시간입니다 🧪
//main.go
func main() {
maleDeveloper := Male{
name: "John",
age: "22",
department: Developer{},
}
fmt.Println(maleDeveloper.describePerson())
fmt.Println("-------------")
femalePM := Female{
name: "Natalie",
age: "24",
department: PM{},
}
fmt.Println(femalePM.describePerson())
}
이 프로그램의 출력은 다음과 같아야 합니다.
John is a 22 years old man
He works in the software development department
-------------
Natalie is a 24 years old woman
She works in the product management department
그것이 당신을 위한 브릿지 패턴입니다 😉
이 튜토리얼의 모든 코드는 this github repo에서 찾을 수 있습니다.
건배 ☕️
Reference
이 문제에 관하여(브릿지 패턴 🌉), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shubhamzanwar/bridge-pattern-2hi5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)