行为型模式(二)

来源:互联网 发布:淘宝购物车营销工具 编辑:程序博客网 时间:2024/05/22 17:29

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

当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。

好处:容易改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法。因为定义抽象语法树中的各个节点的类的实现大体类似,这些类都易于直接编写。

不足:文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。


中介者模式(世界需要和平):用一个中介对象来封装一系列的对象交互。中介者使各对像不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性了,因为大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难。中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

优点:中介者的出现减少了各个类之间的耦合,使得可以独立地改变和复用;把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,站在一个更宏伟的角度去看待系统。

缺点:由于中介者对象控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个具体类对象都复杂。


 

访问者模式(男人和女人):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。也就是说在不改变对象结构中的男人类和女人类(因为这个是稳定的),定义对他们的新的操作,比如增加一个婚姻状态的操作。这里用到了双分派技术:在客户端程序中将具体状态作为参数传递给“男人”类完成了一次分派,然后“男人”类调用作为参数的“具体状态”中的方法“男人反应”,同时将自己(this)作为参数传递出去。这便完成了第二次分派。

 访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

访问者模式的目的,把处理从数据结构分离出来,当一个系统有比较稳定的数据结构,又有易于变化的算法时,使用访问者模式使得算法操作的增加变得容易。

优点:增加新的操作容易,意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。缺点就是增加新的数据结构变得困难


策略模式(商场促销):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。这些算法完成的都是相同的工作只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。策略模式就是用来封装算法的,但在实践中,可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。策略模式选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。


备忘录模式(如果在回到从前):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。Originator(发起人)负责创建一个备忘录。Memento(备忘录)负责存储Originator对象的内部状态。Caretaker(管理者)负责保存好备忘录,不能对备忘录的内容进行操作或检查。把要保存的细节给封装在了Memento中了,哪一天要更改保存的细节也不用影响客户端了

备忘录模式适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态,类似于撤销。


迭代器模式(想走?可以!先买票):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。


0 0
原创粉丝点击