行为型设计模式

    行为性设计模式涉及到算法和对象间的职责分配,不仅描述对象或类的模式,还描述它们之间的通信方式。它们采用继承机制在类间分派行为,通过合理的处理方法,达到使系统升级性和维护性提高的目的。

    一共包括11种设计模式,分别为:观察者模式(Observer)、模板方法模式(TemplateMethod)、命令模式(Commander)、状态模式(State)、职责链模式(Chain of Responsibility)、解释器模式(Interpreter)、中介者模式(Mediator)、访问者模式(Visitor)、策略模式(Strategy)、备忘录模式(Memento)、迭代器模式(Iterator),下面分别介绍: 

    1、观察者模式

    功能:定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。

    解释:观察者模式所作的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体(依赖倒转原则)。从而使得各自的变化都不会影响到另一边的变化。

    使用动机:将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。简而言之即当一个对象的改变需要同时改变其他对象而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。

    行为型设计模式_第1张图片

    2、模板方法模式

    功能:定义一个操作的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    解释:通过把不变行为搬移到超类,去除子类中的重复代码,提供了一个很好的代码复用平台。其实就是当不变和可变的行为在方法的子类实现中火鹤在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的方法,这样就帮助子类摆脱重复的不变行为的纠缠。

    使用动机:当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

    行为型设计模式_第2张图片

    3、命令模式

    功能:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;可以对请求排队或记录请求日志,以及支持可撤销的操作。

    优点:a、它能较容易地设计一个命令队列

                b、在需要的情况下,可以较容易地将命令记入日志

                c、允许接受请求的一方决定是否要否决请求

                d、可以容易地实现对请求的撤销和重做

                e、关键点:命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

    行为型设计模式_第3张图片

    4、状态模式

    功能:允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。

    解释:状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。说白了,目的就是消除庞大的条件分支语句(与反射功能有些类似)。当然,如果这个状态判断很简单,那就没必要用‘状态模式’了。

    优点:可以将特定状态相关的行为局部化,并且将不同状态的行为分割开来。即:将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换。

    使用动机:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

    行为型设计模式_第4张图片

    5、职责链模式

    功能:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    优点:职责链模式可以是的接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的时候选接受者的引用,即:大大降低了耦合度。

                 由于是在客户端来定义链的结构,故可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。

    行为型设计模式_第5张图片

    6、解释器模式

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

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

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

    使用动机:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个势力表述为一个简单语言中的巨资。这样就可以构建一个解释器,该解释器通过解释那些句子来解决该问题。

    行为型设计模式_第6张图片

    7、中介者模式

    功能:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用、从而使其耦合松散,而且可以独立地改变他们之间的交互。

    优点:1、Mediator的出现减少了哥哥Colleague的耦合,使得可以独立地改变和服用各个Colleague类和Mediator。

                2、由于把对象如何协作进行了抽象,将终结作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也

                      就是站在一个更宏观的角度去看待系统。

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

    使用动机:中介者模式一般用于一组对象以定义良好但是复杂的方式进行通信的场合,以及向定制一个分部在多个类中的行为,而不像生成太多的子类的场合。

    行为型设计模式_第7张图片

    8、访问者模式

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

    优点:增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

    缺点:增加新的数据结构比较困难。

    使用动机:访问者模式的目的是把处理从数据结构分离开来。如果有比较稳定的数据结构,又有易于变化的算法的话,使用反问着模式比较合适。因为访问者模式使得算法操作的增加变得容易。

    行为型设计模式_第8张图片

    9、策略模式

    功能:定义一系列的算法,把他们一个个封装起来,并且使它们可相互转换。本模式使得算法可独立于使用它的客户而变化。

    解释:策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

    优点:1、策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

                2、简化了单元测试,因为每个算法都有自己的类可以通过自己的接口单独测试。

    实际应用:策略模式+简单工程模式+反射+配置文件可解除客户端需要选择判断的弊病。

    行为型设计模式_第9张图片

    10、备忘录模式

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

    优点:1、使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以恰当的保持封装的边界。

                2、当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

    缺点:角色状态需要完整储存到备忘录对象中,如果状态数据很大很多,那么在资源消耗上,备忘录对象会非常耗内存。

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

    行为型设计模式_第10张图片

    11、迭代器模式

    功能:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

    解释:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样既可以做到不暴露集合的内部结果,又可让外部代码透明地访问集合内部的数据。

    使用动机:当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式;当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。

    行为型设计模式_第11张图片

      

     

    

    

你可能感兴趣的:(行为型设计模式)