1、概述
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
角色
抽象中介者(Mediator): 定义了用于协调各个同事对象之间的交互
真实中介者(ConcreteMediator): 实现了抽象中介者;一般聚合了所有的同事
抽象同事类(colleague): 定义了同事自己的方法,并定义了与中介者通信的方法
具体同事类(ConcreteColleague): 实现抽象同事类;一般持有中介者对象,再与中介者通信
2、优缺点
优点
多个类相互耦合,会形成网状结构(通信路线很多),使用中介者模式将网状结构分离为星型结构进行解耦
减少类间依赖,峰低了耦合,符合迪米特原则
如果出现了Bug,比较容易定位Bug的位置
ConcreteColleague容易复用(如果需要写一个新的对话框,那么按钮、文本输入框都可以很容易使用到新的对话框中)
缺点
中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意
ConcreteMediator难以复用,因为其依赖于特定的应用程序
3、实现方式
public class Test {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2);
colleague1.send("Nice to meet u.");
colleague2.send("Nice to meet u too.");
}
}
public abstract class Mediator {
//抽象的发送消息方法
public abstract void send(String message, Colleague colleague);
}
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
public class ConcreteMediator extends Mediator {
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public void setColleague1(ConcreteColleague1 colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(ConcreteColleague2 colleague2) {
this.colleague2 = colleague2;
}
@Override
public void send(String message, Colleague colleague) {
if(colleague == colleague1) {
colleague2.notify(message);
} else {
colleague1.notify(message);
}
}
}
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void send(String message) {
mediator.send(message, this);
}
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);
}
public void notify(String message) {
System.out.println("同事2得到消息:" + message);
}
}
4、应用场景
一个公司假如没有总经理,这三个部门(财务部、市场部、研发部)互相打交道,虽然只有三个部分,但是关系非常乱:财务部发工资需要市场部和研发部打交道,市场部接个项目,需要和财务部资金支持、研发部技术支持;研发部开发项目需要财务部资金支持。
实际上,公司都有总经理。各个部门有什么事情都报到总经理这里,总经理再通知各个相关部分。
这就是一个典型的中介者模式,总经理起到一个中介、协调的作用。