中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
抽象中介者定义方法接收抽象Colleague,具体中介者定义需要接收的Colleague实体,调用具体Colleague的方法,抽象Colleague含有抽象中介者属性,具体Colleague含有具体通知方法。
优点:减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和具体中介者。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
缺点:由于具体中介者控制了集中化,把交互复杂性变为了中介者的复杂性,这就使得中介者比任何一个具体Colleague都复杂。
/**
* 抽象中介者
*/
public abstract class Mediator {
public abstract void Send(String msg,Colleague colleague); //通知具体同事
}
/**
* 具体中介者
*/
public class ConcreteMediator extends Mediator {
private ColleagueA colleagueA;
private ColleagueB colleagueB;
public ColleagueA getColleagueA() {
return colleagueA;
}
public void setColleagueA(ColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public ColleagueB getColleagueB() {
return colleagueB;
}
public void setColleagueB(ColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
@Override
public void Send(String msg, Colleague colleague) {
if (colleague instanceof ColleagueA){
colleagueA.notify(msg);
}else if (colleague instanceof ColleagueB){
colleagueB.notify(msg);
}
}
}
/**
* 抽象同事
*/
public abstract class Colleague {
private Mediator mediator;
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
}
/**
* 同事A
*/
public class ColleagueA extends Colleague {
public void send(String msg){
this.getMediator().Send(msg,this);
}
public void notify(String msg){
System.out.println("同事A得到消息:" + msg);
}
}
/**
* 同事B
*/
public class ColleagueB extends Colleague {
public void send(String msg){
this.getMediator().Send(msg,this);
}
public void notify(String msg){
System.out.println("同事B得到通知:" + msg);
}
}
public class Main {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
ColleagueA colleagueA = new ColleagueA();
ColleagueB colleagueB = new ColleagueB();
colleagueA.setMediator(concreteMediator); //让同事认识中介者
colleagueB.setMediator(concreteMediator);
concreteMediator.setColleagueA(colleagueA); //让中介者认识具体同事
concreteMediator.setColleagueB(colleagueB);
concreteMediator.Send("第一条通知",colleagueA);
concreteMediator.Send("第二条通知",colleagueB);
}
}