2005年2月19日星期六

《ASD》设计模式:Facade和Mediator

Facade模式和Mediator模式有些相似,虽然尚未相似到令人混淆的地步。在形式上他们是有明显区别的,在功效上却有共通之处,这样的相似更应该注意。
按照GOF的《Design Patterns》一书,Facade模式和Mediator模式都是用于连接多个类,简化类之间的联系。
Facade模式是把大系统藏在自己后面,由自己来做一个通用的接口。使用者不用关系下面的具体类,只要了解Facade的接口,就可以使用系统了。这几乎是最常用的设计模式了。
Mediator也是连接大系统,但是它的客户并不是系统的使用者,而是系统中的各个模块;相应的,它的目的只是为了降低系统中各个模块之间的依赖关系。而对于系统的使用者,Mediator常常是透明的。

《ASD》一书中,不仅强调了这两个模式的更多特性,还挖掘了这两个模式之间更内在的关系。即他们都是为了施加策略,Facade模式是从上面施加,Mediator是从下面施加。
所谓策略,即如何使用系统中的模块。
于此一说,如何应用Facade模式来施加策略就昭然若揭了。既然调用者只是发出命令,由Facade对象解释命并调用系统中的模块来执行命令,那么Facade对象就可以在执行时,控制各个模块之间的关系了。
这个有些Template模式或Strategy模式的味道。
由于是从调用这一端执行,所以可以说,这是从上面施加策略,或者可以说是一种主动策略

在《Design Pattern》书中,Mediator对于系统的客户是透明的,但是系统中的各个模块基本上都还是指能够看到Mediator。
可是在《ASD》书中,Mediator对于系统中的各个模块基本上也是半透明的了。
Mediator知道所有的模块,和他们之间的关系。
而各个模块并不知道Mediator的存在,它们能看到的,只是一个消息系统,有事就发消息。
当然了,Mediator就在消息系统的另一端倾听。一旦收到了某个模块的消息,他就开始调用相关的其他对象,牵动整个系统。
策略就是如此在系统内部运转,这是这次除了Mediator自己以外,没有对象知道,策略已经开始运作了。
所以可以说,这是从下面施加策略,或者可以说是一种被动策略

两者相比较,主动策略来的更直接,力量更强大。但是如果调用着绕过Facade的接口,直接与系统中子模块对话,策略就会无法实施。
被动策略是隐蔽的,是以相应的方式来运作的,在策略的实施上,有些限制。但是没有模块知道策略的实施,也就不能绕过这些策略。

没有评论: