目录
什么是中介者模式
从字面上来看,就很容易理解中介者模式就是为了解决对象之间错综复杂的耦合关系的一种设计模式。
为什么要使用中介者模式
首先,明确一点,一般在项目里一个对象是不可能孤立存在的,即一个类不存在和其他类没有任何联系的情况,如果有,大概这个类也没有存在的必要了。软件逻辑最终是为了完成现实中的需求,所以对象间必然是相互关联的,当对象间的关联变得错综复杂,相互交错,让人难以整理时,就可以考虑使用中介者模式了。比如A对象要完成某项功能,但只能完成一部分,另外一部分要调用B完成,B在完成功能时又需要调动C,然而C又需要调用A。如此往复在对象间来回交错调用时,现在这个逻辑你可能已经有点头疼了,这就是对象间的关联成了雪花模型了,或者说是网状模型。现在加入中介者在其中,对象只致力于完成自己能完成的功能,如果需要从其他对象中获取任何其他相关功能,直接访问中介者,由中介者去完成。可以看到,中介者的引入解耦了其他对象之间的耦合关系。而中介者持有相关对象,既有能力在中介者内部通过调用对象来完成功能的整合。
中介者模式组成
抽象中介者
public abstract class Mediator {
protected ComObjImp1 co1;
protected ComObjImp2 co2;
public ComObjImp1 getCo1() {
return co1;
}
public void setCo1(ComObjImp1 co1) {
this.co1 = co1;
}
public ComObjImp2 getCo2() {
return co2;
}
public void setCo2(ComObjImp2 co2) {
this.co2 = co2;
}
public abstract void doSomething1();
public abstract void doSomething2();
}
具体中介者
public class MediatorImpl extends Mediator{
@Override
public void doSomething1() {
super.co1.selfFoo();
super.co2.selfFoo();
}
@Override
public void doSomething2() {
super.co1.selfFoo();
super.co2.selfFoo();
}
}
抽象关系类
public abstract class ComObj {
protected Mediator mediator;
public ComObj(Mediator mediator) {
this.mediator = mediator;
}
}
具体关系类
public class ComObjImp1 extends ComObj{
public ComObjImp1(Mediator mediator) {
super(mediator);
}
public void selfFoo(){
//自己内部能解决的事自己做了
System.out.println("c1 do self something");
}
public void depFoo(){
//自个处理不了的,需要外部协作的,交给中介者来处理
super.mediator.doSomething1();
}
}
public class ComObjImp2 extends ComObj{
public ComObjImp2(Mediator mediator) {
super(mediator);
}
public void selfFoo(){
//自己内部能解决的事自己做了
System.out.println("c2 do self something");
}
public void depFoo(){
//自个处理不了的,需要外部协作的,交给中介者来处理
super.mediator.doSomething2();
}
}
测试驱动
public class Main {
public static void main(String[] args) {
Mediator mediator = new MediatorImpl();
ComObjImp1 c1 = new ComObjImp1(mediator);
ComObjImp2 c2 = new ComObjImp2(mediator);
mediator.setCo1(c1);
mediator.setCo2(c2);
c1.depFoo();
}
}
需要注意的几点
我们知道,大多数类之间都是相互关联的,那么是不是所有的耦合关系都要拆成中介者模式呢。当然不是,切勿为了用中介者模式而用。
虽然这里只给出了一个中介者类,但是实际中可以根据功能划分出多个中介者,从而完成不同类别的功能。