下面我们来介绍最后一种类型设计模式,它就是行为型模式。
行为型模式:涉及到算法和对象间的职责分配,不仅描述对象或类的模式,还描述它们之间的通信方式。行为模式采用继承机制在类间分派行为。
1.观察者模式(observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
适用情况:1.当一个对象的改变需要同时改变其他对象的时候;2.二是一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立的改变和复用。
总的来说,观察这模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
2.模板方法(TemplatMethod):定义一个操作的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式把不变行为搬移到超类中,去除了子类中的重复代码。
3.命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;可以对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式将“行为的请求者”与“行为实现者”解耦。
Invoker:调用命令对象执行请求,进行撤销/恢复,记录日志等操作。
Command:定义命令的接口,声明执行的方法。
Receiver:接收者,真正执行命令的对象,任何类都可能作为一个接收者。
ConcreteCommand:将一个接收者对象绑定于一个动作,调用接受者相应的操作,以实现Execute。
4.状态模式(State):允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。状态模式把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑化。
状态模式,将特定的状态相关的行为都封装在ConcreteState中,通过定义新的子类可以很容易地增加新的状态和转换,也就消除了庞大的条件分支语句。
5.职责链模式:(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
6.解释器模式(InterPreter):定义一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生频率足够高,那么我们就可以考虑构建一个解释器来解释这些句子来解决该问题。
7.中介者模式(Mediator)用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者负责控制和协调一组对象间的交互。中介者充当一个隔离的作用,也就是说组合对象不再是互相引用,它们仅知道中介者,这就减少了相互连接的数目。
换句话说,中介者模式就是为了解决多种麻烦关系,并且最好通过一个中间人来解决。也就是将多对多的关系转换成一对一的关系。
8.访问者模式(Visitor)表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据元素相对稳定的系统,也就是说,访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
9.策略模式(Strategy) :定义一系列的算法,把它们一个个封装起来,并且使它们可相互替。策略模式使得算法可独立于使用它的客户而变化。
策略模式将算法进行了封装,这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了算法类与使用算法类之间的耦合。
10.备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状。这样以后就可将该对象恢复到原先保存的状态。备忘录模式将对象,对象状态和状态的保存方法分离,更加灵活。使用备忘录模式可以把复杂的对象内部信息对其他的对象屏蔽起来,并且可以使用暂时存储起来的备忘录将状态复原。
11.迭代器模式(Iterator):提供一种方法顺序访问一个聚合对像中各个元素,而又不暴露该对象的内部表示。迭代器模式将对列表的访问和遍历从列表对象中分离出来,抽象成了一个迭代器,迭代器抽象类用于定义得到开始队形,得到下一个对象,判断是否到结尾、当前对象等抽象方法,统一接口。