1. Mediator(調停者)パターンとは

Mediator(調停者)パターンは、オブジェクト間の直接依存関係を減らすために、それらの通信を調停者オブジェクトに移行することで、動作デザインパターンです。Mediator(調停者)パターンでは、オブジェクト同士が直接通信するのではなく、調停者オブジェクトを介して通信します。

2. Mediator(調停者)パターンの特性と利点

Mediator(調停者)パターンの特性と利点は次の通りです:

  • オブジェクト間の直接結合を減らし、システムの複雑さを低減します。
  • 調停者オブジェクトが彼らの通信を処理することで、オブジェクト間の通信を簡素化します。
  • オブジェクト間の相互作用を集中的に制御し、拡張とメンテナンスを容易にします。

3. Mediator(調停者)パターンの実世界での例

Mediator(調停者)パターンは実世界のシナリオで多くの応用があります。たとえば、空港スケジューリングシステムでは、ディスパッチャーが調停者として機能し、航空機や地上交通などの異なるモジュールが同僚クラスとして、ディスパッチャーを介して通信や調整を行います。

4. GolangでのMediator(調停者)パターンの実装

4.1 UMLクラス図への導入

以下は、GolangでのMediator(調停者)パターンのUMLクラス図です:

Mediator Pattern in Golang

4.2 例の紹介

この例では、Mediator(調停者)パターンを使用して異なるユーザー間の通信を管理する簡単なチャットルームアプリケーションを実装します。

4.3 実装手順1:Mediator(調停者)インターフェースと具体的なMediator(調停者)

最初に、Mediator(調停者)インターフェースと具体的なMediator(調停者)クラスを定義します:

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:Colleague(同僚)インターフェースと具体的なColleague(同僚)

次に、Colleague(同僚)インターフェースと具体的なColleague(同僚)クラスを定義します:

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:Mediator(調停者)での同僚の管理

特定のMediator(調停者)クラスでは、同僚クラス間の通信を管理するために 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 関数では、特定のMediator(調停者)オブジェクトと2つの具体的な同僚オブジェクトを作成し、その後、同僚オブジェクトをMediator(調停者)オブジェクトを介して登録し、通信テストを行います。