1.前言
中介者模式又叫做调停者模式。中介者模式将多对多的相互作用转化为 一对多的相互作用。中介者模式适用于当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为。中介者模式的使用,将系统从网状结构变为了以中介者为中心的星形结构
2.定义
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要 显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
3.UML图
每个具体同事(ConcreteColleague)只知道自己的行为,而不了解其他同事类的情况,但是它们都认识中介者对象。Mediator是抽象中介者,定义了同事对象到中介者对象的接口,具体中介者对象来实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
4.基本代码
//抽象中介者
public abstract class Mediator{
protected ConcreteColleague1 concreteColleague1;//具体同事类1
protected ConcreteColleague2 concreteColleague2;//具体同事类2
/**
* 抽象中介方法,子类实现
*/
public abstract void method();
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
}
//具体中介者
public class ConcreteMediator extends Mediator{
@Override
public void method() {
concreteColleague1.action();
concreteColleague2.action();
}
}
//抽象同事类
public abstract class Colleague{
protected Mediator mediator;//中介者对象
public Colleague(Mediator mediator){
this.mediator = mediator;
}
//同事角色的具体行为,由子类去实现
public abstract void action();
}
//具体同事1
class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void action() {
Log.d("zsf","Colleague1将信息递交给中介者处理");
}
}
//具体同事2
class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void action() {
Log.d("zsf","Colleague2将信息递交给中介者处理");
}
}
5.中介者模式的优缺点
中介者模式下,每个ConcreteColleague都只需要知道自己的行为就好了,减少了与其他ConcreteColleague间的耦合。但是,因为ConcreteMediator需要知道每一个ConcreteColleague,这就使得ConcreteMediator的责任加大了。
总结:①Mediator的出现减少了同事类的耦合,使得可以独立地改变和复用各个Colleague类和Mediator。
②把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,从关注对象本身行为转移到关注其之间的交互,看待的角度更加宏观。