1. Mediator(調停者)パターンとは
Mediator(調停者)パターンは、オブジェクト間の直接依存関係を減らすために、それらの通信を調停者オブジェクトに移行することで、動作デザインパターンです。Mediator(調停者)パターンでは、オブジェクト同士が直接通信するのではなく、調停者オブジェクトを介して通信します。
2. Mediator(調停者)パターンの特性と利点
Mediator(調停者)パターンの特性と利点は次の通りです:
- オブジェクト間の直接結合を減らし、システムの複雑さを低減します。
- 調停者オブジェクトが彼らの通信を処理することで、オブジェクト間の通信を簡素化します。
- オブジェクト間の相互作用を集中的に制御し、拡張とメンテナンスを容易にします。
3. Mediator(調停者)パターンの実世界での例
Mediator(調停者)パターンは実世界のシナリオで多くの応用があります。たとえば、空港スケジューリングシステムでは、ディスパッチャーが調停者として機能し、航空機や地上交通などの異なるモジュールが同僚クラスとして、ディスパッチャーを介して通信や調整を行います。
4. GolangでのMediator(調停者)パターンの実装
4.1 UMLクラス図への導入
以下は、GolangでのMediator(調停者)パターンのUMLクラス図です:
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(調停者)オブジェクトを介して登録し、通信テストを行います。