一、中介者模式简介(Brief Introduction)
中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互中介者减少了各个同事对象的耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑系统。
二、解决的问题(What To Solve)
中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。三、中介者模式分析(Analysis)
Mediator:中介者接口,在里面定义各个同事之间交互需要的方法,可以是公共的通信方法
ConcreteMediator:具体中介者实现对象,它需要了解并维护各个同事对象,并负责具体的协调个同事对象的交互关系
Colleague:同事类得定义,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能
ConcreteColleague:具体的同事类,实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他的同事交互
四、实例代码
1、中介者接口Mediator及其实现
public interface Mediator {
public void change(Colleague colleague);
}
public class ConcreteMediator implements Mediator {
private ConcreteColleagueA concreteColleagueA;
private ConcreteColleagueB concreteColleagueB;
public void setconcreteColleagueA(ConcreteColleagueA concreteColleagueA){
this.concreteColleagueA = concreteColleagueA;
}
public void setconcreteColleagueB(ConcreteColleagueB concreteColleagueB){
this.concreteColleagueB = concreteColleagueB;
}
public void change(Colleague colleague) {
if(colleague == concreteColleagueA){
System.out.println("============"+colleague.getClass().getSimpleName()+"================");
}else if(colleague == concreteColleagueB){
System.out.println("============"+colleague.getClass().getSimpleName()+"================");
}
}
}
2、同事类Colleague及其实现
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public Mediator getMediator(){
return this.mediator;
}
}
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator){
super(mediator);
}
public void someOperation(){
getMediator().change(this);
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator){
super(mediator);
}
public void someOperation(){
getMediator().change(this);
}
}
3、客户端调用
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB(mediator);
mediator.setconcreteColleagueA(concreteColleagueA);
mediator.setconcreteColleagueB(concreteColleagueB);
concreteColleagueA.someOperation();
concreteColleagueB.someOperation();
}
}
运行结果: