中介者模式
本质:封装交互
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 对象间的松耦合。
- 对象间的交互和通信封装在中介类中,各个对象间的通信不必显式声明和引用,大大降低了系统的复杂性能。
UML图
各个Colleague维护一个Mediator,Colleague和Mediator相互知道,但各个Colleague彼此不知道,若ConcreteColleague1和ConcreteColleague2要交互,就通过ConcreteMediator来处理(迪米特法则)
将多对多的通信简化为了一(Mediator)对多(Colleague)的通信。
示例代码
public abstract class Mediator {
public abstract void send(String message,Colleague colleague);
}
public class ConcreteMediator extends Mediator{
private Colleague colleague1;
private Colleague colleague2;
public void setColleague1(Colleague colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Colleague colleague2) {
this.colleague2 = colleague2;
}
@Override
public void send(String message, Colleague colleague) {
if(colleague==colleague1) {
colleague2.notify(message);
}else {
colleague1.notify(message);
}
}
}
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
public abstract void notify(String message);
}
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message, this);
}
@Override
public void notify(String message) {
System.out.println("同事1收到信息:"+message);
}
}
public class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message, this);
}
@Override
public void notify(String message) {
System.out.println("同事2收到信息:"+message);
}
}
public class Main {
public static void main(String[] args) {
ConcreteMediator m = new ConcreteMediator();
ConcreteColleague1 c1 = new ConcreteColleague1(m);
ConcreteColleague2 c2 = new ConcreteColleague2(m);
m.setColleague1(c1);
m.setColleague2(c2);
c1.send("吃了吗");
c2.send("还没呢");
}
}
优缺点
优点:
- 将多对多的通信转化为一对多的通信,降低了系统的复杂性
- 解耦
- 控制集中,便于管理
缺点:
- 控制集中,把交互复杂性变为了中介者的复杂性
外观模式和中介者模式的区别
都是调配一组相互耦合的对象的通信。
- 外观模式:复杂对象与外部通信
- 中介者模式:复杂对象之间的通信(内部)
中介者模式和观察者模式
可以组合使用,来实现当同事对象发生改变的时候,通知中介对象,让中介对象去进行与其他相关对象的交互