中介者模式

中介者模式

  1. 定义

    Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently;

    使用中介对象封装一系列对象的交互,使得对象不需要显示地相互作用,从而使得其耦合松散,而且可以独立地改变他们之间的交互;

  2. 分析

    中介者模式极善于处理对象间复杂的相互作用~他通过减少类间的依赖,是原来一对多的依赖(一个对象依赖多个其他对象)变成了一对一的依赖(一个对象依赖一个中介者对象);降低了类间耦合,自然提高了系统的稳定性和可维护性;

    中介者模式中的中介者类也容易变得庞大而复杂,虽然该实现的逻辑一样都不会少,也一样不会多,但是由于中介模式将原本分布在各个类中间的“交互代码”集中由中介者处理,复杂就在所难免;如果对线之间出现了紧密耦合的情况,就应该要考虑中介者模式了,所谓紧密耦合是说“蜘蛛网”班的结构;

  3. 实现

    中介者模式的实现核心就是将右图的结构变为左图!
    中介者模式

  4. 面向对象程序设计原则的关系
    1. 单一职责原则:体现尤为明显,Colleague有自己的任务,虽然该任务的执行过程中涉及到同其他Colleague的交互,但是这交互毕竟不是核心职责,而且还很危险:非常容易变化,比如我要卖西瓜,我就负责把瓜给你,你把钱给我就好,虽然我也应该考虑如何把瓜卖出去的更多,但是这毕竟不是我的核心业务和本行,专业的事情交给专业的人做不好吗?市场分析人员根据供给分析、预测等环节,直接告诉我就好,别让我在卖瓜时总问。而且今天我是问A,明天我要问B,我还得负责换人的问题,不好不好;
    2. 历史替换原则:这应该是Java编程所一贯遵守的原则;
    3. 依赖倒置:高层不应该依赖低层,他们都应该依赖抽象;将Colleague之间的相互依赖转变为对Mediator这一抽象的依赖;
    4. 接口隔离:呜呜,没看出来;
    5. 迪米特原则:这个可以有,Colleague对象以前要知道所有的相关Colleague,现在只需要知道Mediator这一对象,是知道的少了一些,这样就比较稳定了;自然Mediator知道的多了,但是我们可以通过比较方便的扩展来实现Mediator的可扩展性(比如基于接口编程等)以及可维护性;
    6. 开闭原则:修改后对交互方式的扩展明显要方便很多,因为影响的范围从N多个Colleague变味了一个Mediator嘛