1. 认识中介者模式
1. 定义:用一个中介对象来封装一系列的对象交互行为,中介者使得各对象不需要显式的互相引用,从而使其松散耦合,独立的改变他们之间的交互。
2. 结构:
- Mediator:中介者接口,在里面定义各个同事之间交互需要的办法,可以是公共的通讯方法,也可以是小范围的交互方法。
- MediatorImpl:中介者具体实现类,他需要了解并维护各个交互的对象,并负责各个对象之间的交互关系。
- Colleague:同事类,同事类通常定义为抽象类,主要负责约束同事对象的类型,并实现一些公共方法,比如每个同事类都应该持有中介者对象。
- ColleagueImpl:具体的同事类,实现自己的功能,在需要与其他同事类进行交互时,就通过持有的中介者对象来进行交互。
3. 参考代码实现:
/** * @ClassName:Mediator * @Description:中介者接口 */public interface Mediator { //定义同事对象之间的交互接口,比如 public void exchange(Colleague c);}/** * @ClassName:MediatorImpl * @Description:中介者具体实现类,必须维护一系列需要交互的同事类对象 */public class MediatorImpl implements Mediator { //维护同类对象 private ColleagueImplA a; private ColleagueImplB b; public void setA(ColleagueImplA a) { this.a = a; } public void setB(ColleagueImplB b) { this.b = b; } @Override public void exchange(Colleague c) { // 在此处定义同事类对象之间的交互动作,传入参数c表示该对象发生了变化,需要与其他同事类对进行交互 }}/** * @ClassName:Colleague * @Description:同事类的抽象父类 */public abstract class Colleague { //持有中介者对象 Mediator m; public Colleague(Mediator m){ this.m=m; } //获取当前同事类对象中的中介者对象 public Mediator getMediator(){ return m; }}public class ColleagueImplA extends Colleague{ public ColleagueImplA(Mediator m) { super(m); } //示意方法,表示某些功能 public void operation(){ //如果需要与其他同事类对象进行交互,通知中介者对象 getMediator().exchange(this); }}public class ColleagueImplB extends Colleague{ public ColleagueImplB(Mediator m) { super(m); } //示意方法,表示某些功能 public void operation(){ //如果需要与其他同事类对象进行交互,通知中介者对象 getMediator().exchange(this); }}
2. 理解中介者模式
1. 功能:封装对象之间的交互行为,由中介者对象来处理多个对象之间的交互关系。
2. Mediator接口不一定需要,可以直接使用中介者实现类,这取决于中介者类是否需要多个实现类型,或者说是否需要扩展版本,
3. 同事类:在中介者模式中,所有同事类都需要继承同一个父类来建立起一个同事的关系。
4. 中介者类对象与同事类对象之间的通信:一种实现方法是定义一个特殊的通知接口,作为一个通用的方法,让各个同事类对象调用该方法,比如上面的参考代码;还有一种实现方法,可以使用观察者模式,让Mediator成为观察者,同事类为Subject,同事类对象发送变化就会通知观察者进行对应的交互行为。
5. 优缺点:
- 松散耦合
- 集中控制交互
- 多对多变为一对多
- 缺点就是过度集中化