1. 중재자 패턴이란
중재자 패턴은 객체 간의 직접적인 의존성을 줄이기 위해 그들의 통신을 중재자 객체로 전달하는 행동 디자인 패턴입니다. 중재자 패턴에서 객체들은 더 이상 직접적으로 서로 통신하지 않고, 대신 중재자 객체를 통해 통신합니다.
2. 중재자 패턴의 특징 및 장점
중재자 패턴의 특징과 장점은 다음과 같습니다:
- 객체간의 직접적인 결합을 줄여 시스템 복잡성을 낮춥니다.
- 중재자 객체가 객체들 간의 통신을 처리함으로써 객체간의 통신을 간단화합니다.
- 객체들 간의 상호작용을 집중적으로 제어함으로써 확장성과 유지보수를 용이하게 합니다.
3. 중재자 패턴의 실제 예시
중재자 패턴은 현실에서 다양한 분야에 응용됩니다. 예를 들어, 공항 스케줄링 시스템에서 디스패처가 중재자 역할을 하고, 비행기 및 지상 교통과 같은 다양한 모듈들이 동료 클래스 역할을 하며 디스패처를 통해 통신하고 조정합니다.
4. Golang에서 중재자 패턴의 구현
4.1 UML 클래스 다이어그램 소개
아래는 Golang에서 중재자 패턴의 UML 클래스 다이어그램입니다:
4.2 예시 소개
이 예시에서는 중재자 패턴을 사용하여 다른 사용자들 간의 통신을 관리하는 간단한 채팅방 응용 프로그램을 구현할 것입니다.
4.3 구현 단계 1: 중재자 인터페이스 및 구체적인 중재자 정의
먼저, 중재자 인터페이스와 구체적인 중재자 클래스를 정의합니다:
type Mediator interface {
registerColleague(colleague Colleague)
sendMessage(message string, colleague Colleague)
}
type ConcreteMediator struct {
colleagues map[string]Colleague
}
func (m *ConcreteMediator) registerColleague(colleague Colleague) {
m.colleagues[colleague.getName()] = colleague
}
func (m *ConcreteMediator) sendMessage(message string, colleague Colleague) {
for _, c := range m.colleagues {
if c != colleague {
c.receiveMessage(message)
}
}
}
4.4 구현 단계 2: 동료 인터페이스 및 구체적인 동료 정의
다음으로, 동료 인터페이스와 구체적인 동료 클래스를 정의합니다:
type Colleague interface {
receiveMessage(message string)
sendMessage(message string)
getName() string
}
type ConcreteColleagueA struct {
mediator Mediator
name string
}
func (c *ConcreteColleagueA) receiveMessage(message string) {
fmt.Printf("%s가 메시지를 받았습니다: %s\n", c.name, message)
}
func (c *ConcreteColleagueA) sendMessage(message string) {
c.mediator.sendMessage(message, c)
}
func (c *ConcreteColleagueA) getName() string {
return c.name
}
type ConcreteColleagueB struct {
mediator Mediator
name string
}
func (c *ConcreteColleagueB) receiveMessage(message string) {
fmt.Printf("%s가 메시지를 받았습니다: %s\n", c.name, message)
}
func (c *ConcreteColleagueB) sendMessage(message string) {
c.mediator.sendMessage(message, c)
}
func (c *ConcreteColleagueB) getName() string {
return c.name
}
4.5 구현 단계 3: 중재자에서 동료들 관리
특정 중재자 클래스에서 동료 클래스들 간의 통신을 관리하기 위해 registerColleague
메소드와 sendMessage
메소드를 구현해야 합니다:
func main() {
mediator := &ConcreteMediator{
colleagues: make(map[string]Colleague),
}
colleagueA := &ConcreteColleagueA{
mediator: mediator,
name: "동료 A",
}
colleagueB := &ConcreteColleagueB{
mediator: mediator,
name: "동료 B",
}
mediator.registerColleague(colleagueA)
mediator.registerColleague(colleagueB)
colleagueA.sendMessage("안녕하세요, 세계!")
colleagueB.sendMessage("안녕하세요, 여러분!")
}
main
함수에서 특정 중재자 객체와 두 개의 특정 동료 객체를 생성한 후, 중재자 객체를 통해 동료 객체를 등록하고 통신을 테스트합니다.