本来这一章是想一起写完中介者模式 观察者模式 备忘录模式的,但是觉得中介者在实际中比较有意义,所以单独一章吧。
中介者模式
用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
实例:
中介者有两个接口:注册会员,为会员配对。具体终结者实现这两个接口。其中男女双方是各自独立的,不需要直接交互。
解耦原理解析
当然,这里还看不出来实际的效果。再看一个例子:采购,库存,销售:
相互依赖,或许还可以。但是一个系统不可能这么简单。当模组增加以后:
天呐,这代码怎么写?写出来怎么维护?简直是要了老命了。
好在,我们有终结者,不,是中介者模式:
可以看到,每个模块只做好自己的事就好了,自己提供接口和实现,不需要关心别的模组。这一切,让中介者去关心吧。我只需要提供接口给它,或者使用它提供的接口就好了。
应用实例
很多年前,我开发的多媒体播放器有这么一件事:
新加入的模组启动,需要通知之前的模组停下来。屏幕就一个,手机在拍照的时候,电影播放需要停下来吧?
三个模组还好,如果更多会怎样?我在自己的模组里面需要同时给十几个模组发消息。关键是,每新加一个模组,就需要修改所有的模组代码。工作量大是一回事,一处出错就全错了,疯了!
很简单的做法,就是加入一个资源管理员做中介:
于是,每个模组只需要写好和管理员的两个接口就好,以后有模组增加和删减,旧模组都不用关心:
1.Media(发送启动消息)----管理员(发送停止给当前的模组BT)—BT(停止播放)
2.FM (发送启动消息)----管理员(发送停止给当前的模组Media)—Media(停止播放)
这样,每个模组只需发送启动和停止消息,并接受管理的启动和停止命令就好了。我根本不需要知道我启动时系统需要做什么,也不知道我停止是因为啥原因。
代码实战
接下来,我们看看采购-库存-销售的实例,扩展一下普通的中介者实现。
采购-库存-销售,都继承抽象同事对象,他们相互之间不需要关联和依赖,而是由中介者统一调度。
中介者继承抽象中介,统一调度各个具体同事。
AbstractMediator的作用是实现中介者的抽象定义,定义了一个抽象方法execute。这个抽象方法叫做事件方法,处理多个对象之间的关系。
我们可以根据业务需要,定义多个中介者,划分他们的具体职责。