中介者模式
定义
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
UML图描述
中介者模式主要包含四种角色:
- 抽象中介类角色:如下图的Mediator
- 具体中介类角色:如下图的ConcreteMediator
- 抽象同事类角色:如下图的Colleague
- 具体同事类角色:如下图的ConcreteColleague1,ConcreteColleague2

代码实现
/**
* 抽象中介类
*/
public abstract class Mediator {
protected List<Colleague> colleagues;
public Mediator(){
colleagues = new ArrayList<>();
}
public void register(Colleague colleague){
colleagues.add(colleague);
colleague.setMediator(this);
}
public abstract void behavior(Colleague colleague,String msg);
}/**
* 具体中介类
*/
public class ConcreteMediator extends Mediator{
@Override
public void behavior(Colleague colleague, String msg) {
if(colleagues.contains(colleague)){
colleague.receiveMsg(msg);
}else{
System.out.println("该对象不在中介类可联系的范围");
}
}
}/**
* 抽象同事类
*/
public abstract class Colleague {
protected Mediator mediator;
public void receiveMsg(String str){
System.out.println(str);
}
public abstract void sendMsg(Colleague colleague,String str);
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
}/**
* 具体同事类1
*/
public class ConcreteColleague1 extends Colleague {
@Override
public void sendMsg(Colleague colleague, String str) {
this.mediator.behavior(colleague,str);
}
}/**
* 具体同事类2
*/
public class ConcreteColleague2 extends Colleague {
@Override
public void sendMsg(Colleague colleague, String str) {
this.mediator.behavior(colleague,str);
}
}/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Colleague colleague1 = new ConcreteColleague1();
Colleague colleague2 = new ConcreteColleague2();
mediator.register(colleague1);
mediator.register(colleague2);
colleague1.sendMsg(colleague2,"你好,这是colleague1发来的打招呼信息");
colleague1.sendMsg(colleague1,"你好,这是colleague2发来的打招呼信息");
}
}适用场景
1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
2.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
3.交互的公共行为,如果需要改变行为则可以增加新的中介者类。
中介者模式的优点
1.简化了对象之间的交互。
2.将各同事解耦。
3.减少子类生成。
4.可以简化各同事类的设计和实现。
中介者模式的缺点
1.在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
