文章目录
- 1. 概述
- 1.1 作用
- 1.2 角色
- 1.3 类图
- 2. 代码示例
- 2.1 设计
- 2.2 代码
- 2.3 类图
1. 概述
仲裁者(Mediator)可以封装和协调多个对象之间的耦合交互行为,以减弱这些对象之间的耦合关联。
1.1 作用
将多个对象相互耦合的设计转变为所有对象通过中介协作,从而降低其耦合性
多个对象相互耦合:
所有对象通过中介(E)相互协作
1.2 角色
抽象仲裁者(Mediator)角色:封装和实现其子类的协作行为。
具体仲裁者(ConcreteMediator)角色:实现仲裁者行为。
抽象协作者类(Colleague)角色:持有指向仲裁者Mediator对象的引用
具体协作者(ConcreteColleague):
1.3 类图
2. 代码示例
2.1 设计
- 定义抽象仲裁者
Mediator
- 定义具体仲裁者
ConcreteMediator
- 它依赖了需要的具体协作者
ConcreteColleagueA
、ConcreteColleagueB
、ConcreteColleagueC
- 它的
Process()
方法选择了如何执行何种实际协作者
- 它依赖了需要的具体协作者
- 定义了抽象协作者
Colleague
- 定义了各个实际协作者
ConcreteColleagueA
、ConcreteColleagueB
、ConcreteColleagueC
- 它们实现了抽象协作者
Colleague
- 它们都依赖了抽象仲裁者
Mediator
- 它们的
Action()
方法,通过所依赖的仲裁者,执行对应的实际协作者的Option()
方法 - 它们的
Option()
方法,是实际协作中的操作
- 它们实现了抽象协作者
- 调用
- 实例化一个具体仲裁者
- 实例化三个具体协作者
- 每个具体协作者关联仲裁者实例
- 分别执行三个仲裁者的Action()方法完成每一次协作
2.2 代码
- 代码
package mainimport "fmt"// 抽象中介
type Mediator interface {Process(colleague Colleague)
}// 实际中介,它持有所有具体协作者
type ConcreteMediator struct {concreteColleagueA *ConcreteColleagueAconcreteColleagueB *ConcreteColleagueBconcreteColleagueC *ConcreteColleagueC
}// 该方法实现了各协作者之间通过实际中介的相互协作(该例中实际中介同时维护了实际协作者的协作关系)
func (cm *ConcreteMediator) Process(colleague Colleague) {switch {case colleague == cm.concreteColleagueA:cm.concreteColleagueA.Option()cm.concreteColleagueC.Option()case colleague == cm.concreteColleagueB:cm.concreteColleagueB.Option()cm.concreteColleagueC.Option()case colleague == cm.concreteColleagueC:cm.concreteColleagueC.Option()}
}// 抽象协作者
type Colleague interface {Action()
}// 定义实际协作者A,它关联了中介
type ConcreteColleagueA struct {mediator Mediator
}// 该方法调用中介,已达到调用其他协作者的目的(调用顺序由中介维护)
func (a *ConcreteColleagueA) Action() {a.mediator.Process(a)
}// 该方法是协作者A自身的操作
func (e *ConcreteColleagueA) Option() {fmt.Println("ConcreteColleagueA")
}// 实际协作者B(说明同协作者A)
type ConcreteColleagueB struct {mediator Mediator
}func (e *ConcreteColleagueB) Action() {e.mediator.Process(e)
}func (e *ConcreteColleagueB) Option() {fmt.Println("ConcreteColleagueB")
}// 实际协作者C(说明同协作者A)
type ConcreteColleagueC struct {mediator Mediator
}func (t *ConcreteColleagueC) Action() {t.mediator.Process(t)
}func (t *ConcreteColleagueC) Option() {fmt.Println("ConcreteColleagueC")
}func main() {//实例化一个具体中介concreteMediator := &ConcreteMediator{}//实例化三个实际协作者concreteColleagueA := &ConcreteColleagueA{mediator: concreteMediator,}concreteColleagueB := &ConcreteColleagueB{mediator: concreteMediator,}concreteColleagueC := &ConcreteColleagueC{mediator: concreteMediator,}//具体中介应持有所有协作者concreteMediator.concreteColleagueA = concreteColleagueAconcreteMediator.concreteColleagueB = concreteColleagueBconcreteMediator.concreteColleagueC = concreteColleagueC//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者concreteColleagueA.Action()//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者concreteColleagueB.Action()//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者concreteColleagueC.Action()
}
- 输出