模式定义
用一个中介对象来封装(封装变动)一系列的对象交互,中介者使各对象不须要显示的互相援用,从而使其耦合涣散(治理变动),而且能够独立地扭转它们之间的交互
类图
利用场景
当多个对象相互关联交互并存在简单的援用关系时,且对新需要须要进行大量更改时应用中介者模式解耦合
长处
能够防止互相交互的对象之间的紧耦合援用关系,从而更好地抵挡变动
要点总结
要点总结
- 将多个对象间简单的关联关系解耦,Mediator模式将多个对象间的管制逻辑进行集中管理,变“多个对象相互关联”为“多个对象和一个中介者关联”,简化了零碎的保护,抵挡了可能的变动
- 随着管制逻辑的复杂化,Mediator具体对象的实现可能相当简单,这时候能够对Mediator对象进行合成解决
- Facade模式是解耦零碎间(单向)的对象关联关系,Mediator模式是解耦零碎内各个对象之间(双向)的关联关系
Go语言代码实现
工程目录
mediator.go
package Mediatorimport "fmt"type Mediator interface { Communicate (who string)}type WildStallion interface { SetMediator(mediator Mediator)}type Bill struct { mediator Mediator}func (b * Bill) SetMediator(mediator Mediator) { b.mediator = mediator}func (b * Bill) Respond () { fmt.Println("bill what ?") b.mediator.Communicate("bill")}type Ted struct { mediator Mediator}func (t *Ted) Talk () { fmt.Println("Ted : Bill?") t.mediator.Communicate("Ted")}func (t *Ted) SetMediator(mediator Mediator) { t.mediator = mediator}func (t *Ted) Respond() { fmt.Println("Ted:how are you today?")}type ConcreteMediator struct { Bill Ted}func NewMediator() *ConcreteMediator { mediator := &ConcreteMediator{} mediator.Bill.SetMediator(mediator) mediator.Ted.SetMediator(mediator) return mediator}func (m *ConcreteMediator) Communicate(who string) { if who == "Ted" { m.Bill.Respond() }else { m.Ted.Respond() }}
mediator_test.go
package Mediatorimport "testing"func TestNewMediator(t *testing.T) { mediator := NewMediator() mediator.Ted.Talk()}