首页 > 代码库 > 设计模式之“行为型模式”(二)

设计模式之“行为型模式”(二)

    行为型模式第二部分:解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。


解释器模式

    给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
    
    使用时期
    如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

中介者模式

   用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显试地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
   
一、优点
    1、减少了各个对象之间的耦合,使得可以独立地改变和复用各个对象和中介者。
    2、将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
    
二、缺点
    由于中介者控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个对象都复杂。

三、适用范围
    1、用于一组对象以定义良好但是复杂的方式进行通信的场合。
    2、想制定一个分布在多个类中的行为,而又不想生成太多的子类的场合。

访问者模式

    表示一个作用于对象结构中的个元素的操作。它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。

一、使用范围
    数据结构相对稳定的系统
    
二、作用
    把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

三、目的
    把处理从数据结构分离出来。
    
四、优点
    增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

策略模式

    把算法分别封装起来,使算法与算法之间可以替换,并且使得在变化的同时不影响使用算法的客户。

    策略模式的优点:
    1、减少耦合:可以以相同的方式调用所有的算法,只是实现不同,减少了各种算法与使用算法类之间的耦合。
    2、使用继承:策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
    3、简化单元测试:每个算法都有自己的类,可以通过自己的接口单独测试。
    4、避免大量判断:将不同的行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。
    5、封装算法:为不同的类型定义了不同的策略类和相应支持算法的接口,从而封装了具体的算法或行为。

备忘录模式

    在不破坏封装性的前提下,捕获一个对象的内部状态,并对该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

一、作用
    1、把要保存的细节给封装在Memento中了,哪一天要更改保存的细节,也不用影响客户端了。
    2、使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来。
    3、角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

二、使用范围
    比较适用于功能比较复杂的,但是需要维护或记录属性历史的类,

三、与命令模式的关系
    在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。

迭代器模式
    1、提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
    2、为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
    3、分离了集合对象的遍历行为,抽象出了一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

    适用范围
    1、需要访问一个聚集对象,而且不管这些对象时什么都需要遍历的时候,应该考虑使用迭代器模式。
    2、需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。





设计模式之“行为型模式”(二)