中介者模式
中介者模式(Mediator Pattern):引入一个“第三者”来降低现有系统中类之间的耦合度,由这个“第三者”来封装并协调原有组件两两之间复杂的引用关系,使之成为一个松耦合的系统。
加入中介者后的系统前后对比(图片来源)
迪米特法则:又叫作最少知识原则(Least Knowledge Principle 简写LKP),
迪米特法则的初衷在于降低类之间的耦合由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过中介者来转达。
因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
中介者模式是迪米特法则的典型应用(另外,还有门面模式)。
中介者模式的本质:解耦
中介者模式中的角色
Mediator(抽象中介者):定义各组件(或同事对象)之间通信的方法
ConcreteMediator(具体中介者):实现抽象中介者,以此协调各个同事对象来实现协作行为
Colleague(抽象同事类):定义各个同事类的公有方法,并声明一些抽象方法来供子类实现,同时维持对抽象中介者类的引用
ConcreteColleague(具体同事类):抽象同事类的子类;同事对象通过中介者来间接完成与其他同事类的通信
假如有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。
类A类B互相影响,就A、B就相互称彼此为同事类。
中介者模式的结构代码
Mediator:抽象中介者,一般是一个抽象类
ConcreteMediator:具体中介者
Colleague:抽象同事类,维持了一个抽象中介者的引用,用于调用中介者的方法
ConcreteColleague:具体同事类
Colleague类的代码中,自身方法(Self-Method)与依赖方法(Depend-Method)的区别:假如类A在修改自身某属性后,必须要去修改类B的有个属性,那么类A中就要有两个方法,updateSelf()以及updateB(),那么对A而言,updateSelf()就是自身方法,updateB()就是类A的依赖方法。不引入中介者的话,因为有updateB()这个操作,类A就必须持有类B的引用,而引入中介者后,这个依赖方法就可以交给中介者去做(有没有很像门面模式???)。在这种模式下,每个对象都会在自己的状态改变时通知中介者;每个对象都会对中介者所发出的请求作出回应(有没有很像观察者模式???)。
举个例子:现在你想在电脑上播放一张CD,需要光驱读取,光驱读取后将数据交给CPU处理,CPU处理完之后,将CD中的视频信息交给显卡去显示,将音频信息交给声卡去播放。而主板相当于中介者,光驱、CPU、显卡、声卡之间的交互都通过主板来完成。
Colleague:抽象同事类
ConcreteColleague:有四个,分别是光驱、CPU、显卡、声卡
Mediator
ConcreteMediator,中介的具体实现,即主板
Client
参考
实例代码来自:《研磨设计模式--第10章 中介者模式(Mediator)》
Last updated