仲裁者(Mediator)可以封装和协调多个对象之间的耦合交互行为,以减弱这些对象之间的耦合关联。
将多个对象相互耦合的设计转变为所有对象通过中介协作,从而降低其耦合性
多个对象相互耦合:
所有对象通过中介(E)相互协作
抽象仲裁者(Mediator)角色:封装和实现其子类的协作行为。
具体仲裁者(ConcreteMediator)角色:实现仲裁者行为。
抽象协作者类(Colleague)角色:持有指向仲裁者Mediator对象的引用
具体协作者(ConcreteColleague):
MediatorConcreteMediator
ConcreteColleagueA、ConcreteColleagueB、ConcreteColleagueCProcess()方法选择了如何执行何种实际协作者ColleagueConcreteColleagueA、ConcreteColleagueB、ConcreteColleagueC
ColleagueMediatorAction()方法,通过所依赖的仲裁者,执行对应的实际协作者的Option()方法Option()方法,是实际协作中的操作package main
import "fmt"
// 抽象中介
type Mediator interface {
Process(colleague Colleague)
}
// 实际中介,它持有所有具体协作者
type ConcreteMediator struct {
concreteColleagueA *ConcreteColleagueA
concreteColleagueB *ConcreteColleagueB
concreteColleagueC *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 = concreteColleagueA
concreteMediator.concreteColleagueB = concreteColleagueB
concreteMediator.concreteColleagueC = concreteColleagueC
//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者
concreteColleagueA.Action()
//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者
concreteColleagueB.Action()
//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者
concreteColleagueC.Action()
}
