中介者模式(十)

一、引子

1.场景模拟

    假设有一家商店。采购员负责采购商品,销售负责出售商品,商店的库存负责存储商品。他们彼此都存在一定的依赖关系,那么他们之间的关系大致可以如下图描述:


2.场景扩大

    我们知道迪米特法则认为“每个类只和朋友类交流”,然而这个朋友类并非越多越好,朋友类越多,耦合性越大,想要修改一个就得修改一片。这不是我们所期望的。

    上面那个场景还很简单,假如我们再扩大一点,引入供应商,那么他们之间的关系可能就变成下图这样了:


3.网状结构和星型结构

    上面就是一个网状结构,别说写代码了,看都看晕了,所以优秀的程序员就会发现并修改这种设计。

    我们可以引入一个中介者,模块间不再彼此交互,而都是通过中介者来完成,从而实现模块间的解耦。如下图,就是一种典型的星型结构:


    场景中增加一个中介者,其他类只负责处理自己的行为,与自己无关的行为就对给中介者处理。从项目设计上看,加入中介者后结构更清晰了,耦合大大减少。


扫描二维码关注公众号,回复: 1597748 查看本文章

二、定义

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


三、优缺点

优点:

    减少类间的依赖,把一对多的依赖改为一对一的依赖,降低了类间的耦合。

缺点:

    缺点就是中介者会膨胀的很大,而且逻辑复杂。同事类越多,中介者的逻辑就越复杂。


四、使用场景

    1.N个对象之间产生了相互依赖关系(N>2)

    2.多个对象有依赖关系, 但是依赖的行为尚不确定或者有发生改变的可能, 在这种情况下一般建议采用中介者模式, 降低变更引起的风险扩散。

    3.产品开发。 一个明显的例子就是MVC框架, 把中介者模式应用到产品中, 可以提升产品的性能和扩展性, 但是对于项目开发就未必, 因为项目是以交付投产为目标, 而产品则是以稳定、 高效、 扩展为宗旨。


五、实际应用举例

1.机场调度中心

    大家在每个机场都会看到有一个“××机场调度中心”, 它就是具体的中介者, 用来调度每一架要降落和起飞的飞机。 比如, 某架飞机(同事类) 飞到机场上空了, 就询问调度中心(中介者) “我是否可以降落”以及“降落到哪个跑道”, 调度中心(中介者) 查看其他飞机(同事类) 情况, 然后通知飞机降落。 如果没有机场调度中心, 飞机飞到机场了, 飞行员要先看看有没有飞机和自己一起降落的, 有没有空跑道, 停机位是否具备等情况, 这种局面是难以想象的!

2.MVC框架

    MVC框架, 其中的C(Controller) 就是一个中介者, 叫做前端控制器(Front Controller), 它的作用就是把M(Model, 业务逻辑)和V(View, 视图) 隔离开,协调M和V协同工作, 把M运行的结果和V代表的视图融合成一个前端可以展示的页面, 减少M和V的依赖关系。 MVC框架已经成为一个非常流行、 成熟的开发框架, 这也是中介者模式的优点的一个体现。

3.媒体网关

    媒体网关也是一个典型的中介者模式, 比如使用MSN时, 张三发消息给李四, 其过程应该是这样的: 张三发送消息, MSN服务器(中介者)接收到消息, 查找李四, 把消息发送到李四, 同时通知张三, 消息已经发送。 在这里, MSN服务器就是一个中转站, 负责协调两个客户端的信息交流。

4.中介服务

    现在中介服务非常多, 比如租房中介、 出国中介, 这些也都是中介模式的具体体现, 比如你去租房子, 如果没有房屋中介, 你就必须一个一个小区去找, 看看有没有空房子, 有没有适合自己的房子, 找到房子后还要和房东签合约, 自己检查房屋的家具、 水电煤等; 有了中介后, 你就省心多了,找中介, 然后安排看房子, 看中了, 签合约, 中介帮你检查房屋家具、 水电煤等等。 这也是中介模式的实际应用。


查看更多:设计模式分类以及六大设计原则

猜你喜欢

转载自blog.csdn.net/afei__/article/details/80638385