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 함수에서 특정 중재자 객체와 두 개의 특정 동료 객체를 생성한 후, 중재자 객체를 통해 동료 객체를 등록하고 통신을 테스트합니다.