MEDIATOR(中介者)
适用性:
1.一组对象以定义良好但是复杂的方式进行通信,产生相互依赖关系混乱且难以理解。
2.一个对象引用很多其他对象并且直接与这些对象通信,导致难以复用该对象。
3.想定制分布在多个类中的行为,而又不想生成太多的子类
思考:
MEDIATOR模式虽然是协调对象的,但是对对象的组织方式也会带来重大影响。对于一组相互作用的对象,这种相互关系是网状的,搞清楚这组对象之间的联系是很困难的。通过MEDIATOR把这种网状的关系变成星型关系,对象之间的联系被切断了,只要抓住中介对象,就可以理清这一组对象。这样做的代价是,中介对象本身将可能变得非常复杂。通常,这种复杂性表现在接口上,这样一个复杂的、低内聚的接口是难以被复用的,一般也不应该复用中介者对象,那样将会限制中介者的演化。
一个工作对象要和许多对象交互,意味着如果要复用该对象的某种功能,就必须同时提供该对象需要与之交互的那些对象,事情因此而变得复杂。那么提供一个中介者,在中介者中封装访问其他所需对象的方法,那么,工作对象只需要和中介者交互就能获取必须的支持。从工作对象的视角来看,中介者很象是FACADE模式的实现,和FACADE不同的是,中介者提供的接口不像FACADE提供的那样有完备的含义,中介者提供的是一些方法的简单堆砌,而且,工作对象也无法绕过中介者直接访问子系统。这正是MEDIATOR和FACADE在意图上的区别之一。
第三个适用性的关注点是中介者本身,而前两点关注点都是在工作对象上。对于这一点,我觉得比较茫然。如果从字面来理解的话,中介者需要处于一个调停人的角色,并且中介者通常作为动作的发起者才有必要这么做。中介者需要借助其他对象来完成某些事情,从这个角度来说,这样的中介者和模版方法又神似而形非了。例如,中介者的某个方法是个一般的方法模版,假设其中的步骤方法为A,B,C。如果ABC是通过子类化重载来实现的,那是模版方法。如果ABC是分别通过Aobj的FunA,BObj的FunB,CObj的FunC来完成的,而这三个Object是中介者本身来控制的(甚至可以动态装配),也实现了模版方法的一般意图。并且,该方法还具备模版方法不具备的动态配置能力,这又像是策略模式的某些行为方式了。
MEMENTO(备忘录)
适用性:
1.必须保存某一对象在某一时刻的状态,这样,以后需要它是才能恢复到先前的状态。
2.如果用一个接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
思考:
可以把MEMENTO看做是一种还原点,也可以用来实现COMMAND对象的undo方法。还可以用来保存FlyWeight模式中对象的变化部分。对于实现上,通常MEMENTO需要实现宽、窄两套接口。在C++中,通常是使用friend来区分宽窄接口,然而,实际上也可以采用接口的多重继承来分离宽、窄接口。一种是通过dynamic_cast来转换,另一个手段是借助一个间接层来实现改目的()。