中介者模式小记【原创】
几天没写设计模式的总结了,工作上要学的事情多,觉得写写挺麻烦。可是这几天下来发现没写总结后,新学的几个模式之间的区别都搞混淆了,看来做学问真的是没有捷径的。写吧!
先来看一个公司的部门关系
怎么样,由于各个部门之间都会有交互,是不是显得逻辑很混乱?可想而知,就算实现了,日后维护也是相当困难的。于是就有了中介者模式:
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单的说,就是一个星型拓扑图
抽象中介者类:
public abstract class AbstractMediator { protected Purchase purchase; protected Sale sale; protected Stock stock; //构造函数 public AbstractMediator(){ purchase = new Purchase(this); sale = new Sale(this); stock = new Stock(this); } //中介者最重要的方法,叫做事件方法,处理多个对象之间的关系 public abstract void execute(String str,Object...objects); }
抽象同事类:
public abstract class AbstractColleague { protected AbstractMediator mediator; public AbstractColleague(AbstractMediator _mediator){ this.mediator = _mediator; } }
具体的中介者和具体的同事类就不贴出来了,无非是通过多态调用父类的方法。客户端有必要提一下:
public class Client { public static void main(String[] args) { AbstractMediator mediator = new Mediator(); //采购人员采购电脑 System.out.println("------采购人员采购电脑--------"); Purchase purchase = new Purchase(mediator); purchase.buyIBMcomputer(100); //销售人员销售电脑 System.out.println("\n------销售人员销售电脑--------"); Sale sale = new Sale(mediator); sale.sellIBMComputer(1); //库房管理人员管理库存 System.out.println("\n------库房管理人员清库处理--------"); Stock stock = new Stock(mediator); stock.clearStock(); } }
我觉得这里有个比较重要的地方是,需要将中介者注入到每一个具体的同事类中,并且具体的中介者中也有各个同事类的对象,他们是相互关联的。
中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中介者,减少了依赖,当然也同时减低了类间的耦合。它的缺点呢就是中介者会膨胀的很大,而且逻辑会很复杂,因为所有的原本N个对象直接的相互依赖关系转换为中介者和同事类的依赖关系,同事类越多,中介者的逻辑就复杂。
一句话概括中介者模式:桥接模式+子类依赖关系!