<<设计模式之禅(第二版)>>——第十四
2016-10-15 本文已影响9人
leiiiooo
定义:
- 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地互相作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
常用类图:
![](https://img.haomeiwen.com/i1638747/f6a7cb93bd9d1e11.png)
/*
* 定义抽象的中介者类
* 如果每个具体的同事实现类,有各自特有的方法,那么注入的时候
* 应该使用的是同事实现类进行注入,如果每个同事类都有相同的方法,
* 那么应该使用抽象注入,做到依赖倒置原则
* */
public abstract class Mediator {
// 注入具体的同事类
ConcreteColleagueOne concreteColleagueOne;
ConcreteColleagueTwo concreteColleagueTwo;
public ConcreteColleagueOne getConcreteColleagueOne() {
return concreteColleagueOne;
}
public void setConcreteColleagueOne(ConcreteColleagueOne concreteColleagueOne) {
this.concreteColleagueOne = concreteColleagueOne;
}
public ConcreteColleagueTwo getConcreteColleagueTwo() {
return concreteColleagueTwo;
}
public void setConcreteColleagueTwo(ConcreteColleagueTwo concreteColleagueTwo) {
this.concreteColleagueTwo = concreteColleagueTwo;
}
// 中介者处理事务的抽象逻辑
abstract void doSomethinOne();
abstract void doSomethinTwo();
abstract void doSomethinThree();
abstract void doSomethinFour();
}
public class ConcreteMediator extends Mediator {
@Override
void doSomethinOne() {
super.concreteColleagueOne.ownMethod();
super.concreteColleagueTwo.ownMethod();
}
@Override
void doSomethinTwo() {
// TODO Auto-generated method stub
}
@Override
void doSomethinThree() {
// TODO Auto-generated method stub
}
@Override
void doSomethinFour() {
// TODO Auto-generated method stub
}
}
/*
* 抽象的同事类,注入中介者
* */
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
public class ConcreteColleagueOne extends Colleague {
public ConcreteColleagueOne(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
// 定义自己的方法
public void ownMethod() {
// 自己的业务逻辑
}
// 定义依赖的方法
public void depMethod(){
//自己的业务逻辑
super.mediator.doSomethinThree();
}
}
public class ConcreteColleagueTwo extends Colleague {
public ConcreteColleagueTwo(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
// 定义自己的方法
public void ownMethod() {
// 自己的业务逻辑
}
// 定义依赖的方法
public void depMethod() {
// 自己的业务逻辑
super.mediator.doSomethinFour();
}
}
缺点:
- 中介者会体积膨胀得很大,而且逻辑复杂,原本N个对象直接的依赖关系转换为中介者和同事类的依赖关系,同事越多中介者的逻辑就越复杂。
最佳实践:
- 中介者模式很少使用到接口或者抽象类,这与依赖倒置原则是冲突的,主要是类之间是协作关系,完成不同的事情,处理不同的任务,同事关系,不适合抽取父类,统一定义同事所必须有的方法。