一、定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
从下面的示意图我们可以看到中介者模式带给我们的改变:
通过上图,我们不难想象在具体业务开发中的场景,多个对象由于业务的原因互相调用,类与类之间耦合在一起,可谓是牵一发而动全身,比如:对象1
有一个简单的,其他各类根据具体业务也要随之更改,这样就造成后期代码维护极其困难。而如果引入中介者模式,我们可以直观观察到类与类之间的耦合关系变弱了,各个 BO(Business Object,业务对象)
间的互相调用变成各个 BO
与中介者类的调用,这样大大减弱了各个 BO
间的耦合关系。
二、UML 类图表示
Mediator :抽象中介者
ConcreMediator : 具体中介者
BOn : 业务对象
三、具体业务代码
具体根据 UML 类图中我们设计具体业务操作
抽象中介者
public abstract class Mediator {
protected BussinessObjectOne bussinessObjectOne;
protected BussinessObjectTwo bussinessObjectTwo;
public void setBussinessObjectOne(BussinessObjectOne bussinessObjectOne) {
this.bussinessObjectOne = bussinessObjectOne;
}
public void setBussinessObjectTwo(BussinessObjectTwo bussinessObjectTwo) {
this.bussinessObjectTwo = bussinessObjectTwo;
}
public abstract void metod1();
public abstract void metod2();
}
多个 BO
通过 关联关系 与抽象中介者产生调用关系。
具体中介者
public class ConcreteMediator extends Mediator {
@Override
public void metod1() {
super.bussinessObjectOne.selfMethod1();
}
@Override
public void metod2() {
super.bussinessObjectTwo.selfMethod2();
}
}
真正的业务逻辑全部集中在这里进行处理,实现了 BO
之间的 互相调用
转换为各个 BO
与 中介者
之间的 单一调用
关系,实现了解耦合的目的。
抽象业务类
public abstract class BussinessObject {
protected Mediator mediator;
public BussinessObject(Mediator mediator) {
this.mediator = mediator;
}
}
该类的目的为将中介者传入至业务类进行调用。
具体业务类
public class BussinessObjectOne extends BussinessObject {
public BussinessObjectOne(Mediator mediator) {
super(mediator);
}
/**
* 自发行为方法
*/
public void selfMethod1() {
}
/**
* 依赖方法(必须依赖中介者才可以实现)
*/
public void depMethod1() {
super.mediator.metod1();
}
}
public class BussinessObjectTwo extends BussinessObject {
public BussinessObjectTwo(Mediator mediator) {
super(mediator);
}
/**
* 自发行为方法
*/
public void selfMethod2() {
}
/**
* 依赖方法(必须依赖中介者才可以实现)
*/
public void depMethod2() {
super.mediator.metod2();
}
}
业务场景类
public class Client {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
BussinessObjectOne bussinessObjectOne = new BussinessObjectOne(mediator);
BussinessObjectTwo bussinessObjectTwo = new BussinessObjectTwo(mediator);
bussinessObjectOne.depMethod1();
bussinessObjectTwo.depMethod2();
}
}
结
至此,中介者模式的抽象代码如上所示,其实贴这些代码也没什么具体的用处,还是要进行实践,就是照着敲一遍也会有不一样的理解。
四、中介者模式分析
就如中介者模式的定义:用一个中介对象来封装一系列的对象交互
,很明显我们解耦 BO
间的关系,将一系列交互封装到中介者中,这是该模式优点,同时也是它的缺点。随着 BO
的数量、交互的增多,中介者将变的十分臃肿。
后续自己还是会深度学习中介者模式以及其变体,实现更加优化的代码。
本文代码资源:PatternUseThink