行为型模式

 

(1)Chain of Responsibility Pattern

定义:避免请求发送者与接受者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。


优势:可以减少对象的连接,为对象的责任分配增加了很大的灵活性。该模式允许把一组类作为一个类来使用,并且在类的组合中,一个类的事件可以发送到另一个类并由其处理。

劣势:栀子链可以以树状出现,这样,一个事件可以传递给多个类,或者,多个类的信息可以提交到一个类,但缺点是信息在树中容易迷失。

应用场景:

1.   超过一个对象能够处理客户请求并且到底哪个对象处理预先不知道。

2.   一个请求可以发布到多个对象但是它的接受都是不清楚。

3.   可以动态指定一组对象处理请求。

(2)Command Pattern

定义:将一个请求封装成一个对象,一次可以参数化多个客户的不同请求,将请求排队,记录请求日志,并且支持撤销操作。


优势:分离了接受请求的对象与实现处理请求工作的对象,这样,已经存在的类可以保持不变,使得增加新类的工作更简单(如软件的宏命令可以提供系统的自动化程度);可以分离用户界面和业务对象,降低系统的耦合程度。

劣势:类的数量增加,系统变得更加复杂,程序调试也变得困难。

应用场景:

1.   当需要与动作相关的对象来作为参数。

2.   需要在不同的时间创建请求,生成请求队列,执行请求。

3.   需要支持取消、保存修改日志或处理事务(事务包括大量修改的数据)功能。

4.   需要支持宏命令。

(3)Interpreter Pattern

定义:给出一种语言,定义这种语言的文法的一种表示,定义一个解释器,用它来解释使用这种语言的句子。


说明:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。而且当文法简单、效率不是关键问题的时候效果最好。

         1) 抽象表达式角色:声明一个抽象的解释操作,这个接口为所有具体表达式角色(抽象语法树中的节点)都要实现的。
  什么叫做抽象语法树呢?抽象语法树的每一个节点都代表一个语句,而在每个节点上都可以执行解释方法。这个解释方法的执行就代表这个语句被解释。由于每一个语句都代表这个语句被解释。由于每一个语句都代表一个常见的问题的实例,因此每一个节点上的解释操作都代表对一个问题实例的解答。
  2) 终结符表达式角色:具体表达式。
             a) 实现与文法中的终结符相关联的解释操作
             b) 而且句子中的每个终结符需要该类的一个实例与之对应
  3) 非终结符表达式角色:具体表达式。
             a) 文法中的每条规则R::=R1R2…Rn都需要一个非终结符表带式角色
             b) 对于从R1Rn的每个符号都维护一个抽象表达式角色的实例变量
             c) 实现解释操作,解释一般要递归地调用表示从R1Rn的那些对象的解释操作
  4) 上下文(环境)角色:包含解释器之外的一些全局信息。
  5) 客户角色:
             a) 构建(或者被给定)表示该文法定义的语言中的一个特定的句子的抽象语法树
             b) 调用解释操作

优势:Interpreter Pattern的作用很强大,它使得改变和扩展文法变得容易,实现文法也变得简单明了,很多编译器(文本编辑器、网页浏览器及VRML)都应用了该模式。

劣势:对于复杂文法难以维护。可以想象一下,每一个规则要对应一个处理类,而且这些类还要递归调用抽象表达式角色,多如乱麻的类交织在一起是多么恐怖;因为文句会分析成树结构,解释器需要递归访问它,所以效率会受影响。

应用场景:

1.   语言的文法需要扩展

2.   程序的效率不太重要。

(4)Iterator Pattern

定义:提供一种方法可以访问聚合对象,而不用暴露这个对象的内部表示。


优势:
Iterator Pattern支持在聚集中移动游标,使得访问集合中的元素变得简单,简化了聚集的接口,封装了聚集对象。

劣势:聚合密切相关,增加了耦合(将耦合定义在抽象基类可解决该问题)。

应用场景:

1.   需要遍历访问聚集中的对象而不能暴露聚集的内部结构。

2.   允许对聚集的多级遍历访问而不会相互影响。

3.   提供一个一致的接口来遍历访问聚集中不同的结构。

(5)Mediator Pattern

定义:定义一个对象封装一系列多个对象如何相互作用。Mediator中介者使得对象之间不需要显示地相互引用,从而使得耦合更加松散。并且还让我们可以独立变化多个对象相互作用。


优势:它分离了两个同事类,简化了对象协议,中央控制对象交互,从而使个体对象变得更容易且更简单,因为它不需要传递数据给其它个体对象,仅仅传给中介者对象就可以了

应用场景:

1.   一组对象复杂地相互通信但其方法是定义明确的。

2.   若干个对象需要定义方法又不需要子类实现。

(6)Memento Pattern

定义:在不破坏封装的前提下,捕获并且保存一个对象的内部状态,这样可以将对象恢复到原先保存的状态。


优势:
Memento Pattern保存了封装的边界,一个Memento对象是另一种原发器对象的表示,不会被其他代码改动。该模式简化了原发器对象,Memento只保存原发器的状态。采用堆栈备忘录对象,俄可以实现多次取消操作。

应用场景:

1.   对象状态的备忘足以使对象可以完全恢复到原来的状态。

2.   使用一个直接的接口来取得状态会使实现细节过程化,这样会打破对象的封装性。

(7)Observer Pattern

定义:定义对象间的一种一对多依赖关系,使得每当一个对象改变状态,则其相关依赖对象皆得到通知并被自动更新。


说明:如果需要得到某事件通知的对象列表是变化的,或者有条件的,该模式更有价值。
优势:它抽象了被观察对象与观察对象的连接,提供了广播式的对象间通信,并且容易增加新的观察者对象。

劣势:对象间的关系难以理解。

应用场景:

1.   对一个对象的变化请求需要其他对象也变化,并且其它要变化的对象的数量不明确。

2.   一个对象需要通知其他对象而不需要掌握其他对象的识别方法。

(8)State Pattern

定义:当一个对象的内在状态改变时允许改变其行为,这对象看起来(appear)像是改变了其类。


优势:
State Pattern在对象内保存特定的状态并且就不同的状态履行不同的行为,它使状态的变化显得清晰明了,也很容易创建对象的新状态(在工作流和游戏等系统中大量应用)。

应用场景:

1.   对象的行为依赖与它的状态并且它必须可以根据它的状态而改变它的行为。

2.   操作很多部分都带有与状态有关的大量操作语句。

(9)Strategy Pattern

定义:定义一系列算法,将每个算法封装起来,并让它们可以相互替换。Strategy Pattern让算法独立于使用它的客户而变化。


优势:
Strategy pattern提供了替代派生的子类,并定义类的每个行为,剔出了代码中的条件判断语句,使得扩展和结合新的行为变得更容易。

应用场景:

1.   多个类分别只是在于行为不同。

2.   你需要对行为的算法作很多改动。

3.   客户不知道算法要使用的数据。

(10)Template Method Pattern

定义:定义一个操作算法的骨架(Skeleton),以将一些步骤延缓到子类中实现。该模式让子类重新定义一个算法的某些步骤而无须改变算法的结构。
问题:要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同。
解决:允许定义可变的子步骤,同时保持基本过程一致。


优势:该模式在一个类中形式地定义算法,而由它的子类实现细节的处理。它的优势在于在子类定义处理算法时不会改变算法的结构。

应用场景:

1.   你想将相同的算法放到一个类中,将算法变化的部分放在子类中实现。

2.   子类公共的算法应该放在一个公共的类中,避免代码重复。

(11)Visitor Pattern

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


说明:
访问者模式,顾名思义使用了这个模式后就可以在不修改已有程序结构的前提下,通过添加额外的访问者来完成对已有代码功能的提升。

优势:Visitor模式使得增加新的操作变得容易,它可以收集有关联的方法,而分离没有关联的方法,特别适用于因为不同原因而变化的事物(如“在男人中分离出男孩”)。

劣势:打破了对象的封装性,visitorelement需要达成某些共识。

应用场景:

1.   一个对象结构包含多个类对象,它们有不同的接口,并且需要根据具体类对象作不同的处理。

2.   需要对对象结构中的对象有很多不同且没有联系的处理,而你想避免让这些操作污染这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。

3.   当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。

4.   类中定义的对象结构很少改变,但你需要经常地定义处理结构的新操作。

转载于:https://www.cnblogs.com/wxf0701/archive/2008/05/19/1202819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值