Mediator模式-
双向调用,迪米特法则的经典应用网状结构简化为星型结构,不仅仅是维护了各个相关类那么简单,
主要是定义了各个子类之间通信的映射(map或者数组)规则,当一个逻辑类注册了Mediator子类后发送消息会跳转到相应的其它逻辑类调用,且Mediator接口(有子类)定义了映射和操作方法给逻辑类用,逻辑子类有基类接口(繁多子类),基类接口注册给Mediator且定义标准操作方法,他们是双向调用的。
和Facade模式区别:Facade是单向地去管理内部逻辑子类,Mediator与逻辑子类间是双向关联的。
和Facade模式区别:Facade是单向地去管理内部逻辑子类,Mediator与逻辑子类间是双向关联的。
和State模式区别:Stated的数据主体类是定义各个状态子类,主体类并不了解状态间的转换,状态转换被放置到了状态子类中。Mediator定义了各个逻辑子类间的映射调用关系;State驱动发出是数据主体类设置了状态后发出的,Mediator的驱动是由逻辑子类发出的。
Mediator UML:
抽象中介者(Mediator):中介者定义一个接口用于与各同事(Colleague)对象通信。
具体中介者(ConcreteMediator): 具体中介者通过协调各同事对象实现协作行为。了解并维护它的各个同事。
抽象同事类(Colleague class): 定义同事类接口,定义各同事的公有方法.
具体同事类(ConcreteColleague): 实现抽象同事类中的方法。每一个同时类需要知道中介者对象;每个具体同事类只需要了解自己的行为,而不需要了解其他同事类的情况。每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
设计时候:
Colleague有Send和Notify函数,Send是用Mediator对象Operation方法传入本类名实现的,Notify是本类被调用的反应。
Mediator有Operation方法和维护对象间关系的映射表。
使用时候:
- $objMediator = new ConcreteMediator();
- $objC1 = new ConcreteColleague1($objMediator);
- $objC2 = new ConcreteColleague2($objMediator);
- $objC3 = new ConcreteColleague3($objMediator);
- $objC1->send("from ConcreteColleague1");
- $objC2->send("from ConcreteColleague2");
- $objC3->send("from ConcreteColleague3");
当Mediator维护了数据或者状态发生变化时候,Colleague可使用Observers模式与Mediator通信。