行为型模式可以影响一个系统的状态和行为流。
责任链模式:
定义一个抽象处理者,其中包含了设置了下一个处理者和对请求的处理两个方法。具体的处理者都实现了这个接口。用于处理多级请,可以将多个处理者对象串联起来,每个处理者都有机会处理请求,直到某个处理者处理了该请求为止,不再给链上的下一个处理者为止。
应用场景,一个请求的处理,需要多个对象中的一个或若干个对象协作进行处理。
请求的处理者不知道下一个处理的请求对象是谁,链条顺序可以任意组合排序。
过滤器Filter类就用到了这种责任链模式。
命令模式:
用于将请求(调用者发出命令)或操作(命令的执行者执行命令)封装成一个对象。将命令和命令的执行者进行了分离,请求发送者不知道具体的执行者是谁。命令类commandClass维护了一个命令接收者/执行者的引用。
commandClass implements CommandInterface{
Receiver receiver;
Execute(){ receiver.action()}//命令类的执行方法其实是调用的具体执行者的方法。
}
(命令模式和代理、桥接等模式从持有一个中间者的结构上来说很相似,只是++命令模式包括命令调用者,命令,命令执行者,++解耦的是命令调用者和命令执行者之间通过命令来实现解耦,桥接模式是对接口和实现进行解耦)。
解释器模式(Interpreter):
它定义了一个语言的文法,并建立一个解释器来解释该语言中的句子。解释器模式的本质是分离实现,解释执行。它通过一个解释器对象处理一个语法规则的方式,把复杂的功能分离开,然后选择需要被执行的功能,并把这些功能组合成为需要被解释执行的抽象语法树,再按照抽象语法树来解释执行,实现相应的功能。(编译器将高级语言编译成计算机能识别的二进制其实也是一种解释器)
迭代器模式(Iterator):
它提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。迭代器模式为遍历的对象提供了一个统一的接口,使得用户只需要得到迭代器就可以进行遍历,而不用去关心遍历算法。Java中ArrayList类提供了一个方法.Iterator()可以获取一个ArrayList内部的迭代器类private Class Itr implements Iterator。
中介者模式(Mediator):
又叫作调解者模式或调停者模式。类之间的交互行为被统一放在中介者(Mediator)的对象中,对象通过中介者对象同其他对象交互,中介者对象起着控制器的作用,其他对象维护着一个中介者对象的引用并且提供与中介者之间发送和接收消息的接口。中介者模式用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互作用,从而降低耦合,而且可以独立地改变它们之间的交互。JMS,JNDI都是中介者模式中的中介者。
备忘录模式(Memento):
又叫快照模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
游戏存档也是一种备忘录模式。
观察者模式(Observer):
定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。++在观察者模式中,一个目标物件管理所有相依于它的观察者物件++(),并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。Java的锁机制++有点观察者模式的味道(网上有说不是)++,线程竞争资源的时候,如果资源已被锁了,则添加进等待对列或者说观察者对列,锁释放后唤醒等待对列中的某一个线程。被唤醒的线程从等待对列中移除。
状态模式(State):
允许对象在内部状态变化时变更其行为,并且修改其类。根据不同状态来定位行为,或对象的行为依赖于其状态并必须在运行的时候根据状态修改,或具有大量取决于对象状态的条件语句时,可以使用状态模式。
策略模式(Strategy):
定义了一组能够用来表示可能行为的集合,不同策略有不同的行为。咋一看好像状态模式,不同状态有不同行为。策略模式下定义了不同策略的不同行为主要时为了复用,一般一个运行环境下,只选择一种特定的策略,而状态模式中主要关注的时行为随着状态的变化而变化,状态可能时经常变化的,并且可能是很多状态,而策略通常只有一个。例如我建立神经网络模型,底层有不同的算法。我们一遍选择了一个策略,那么整个运行期间就是一种算法了。
模板方法模式(Template Method):
提供了在++不重写方法的前提下允许子类重载部分方法++ 的方法。例如java的抽象类中,将不变的部分,封装成模板方法,子类可以直接使用,不需要重写。或者子类中的其他方法只需要部分重写,然后可以直接调用模板方法,++减少代码重复++。
访问者模式(Visitor):
结构重点在于,每一个元素,都实现了接口的accept(Visitor visitor)方法,可以接收一个具体的(concrete)访问者。并且方法中,访问者会去执行访问这个元素的操作{visitor.visit(this)}++具体的操作就由具体的访问者面对具体的元素的不同具体实现来确定了++。使用了一种可维护的方法来表示在对象结构元素上要进行的操作。允许在不改变操作元素类的前提下定义一个新操作。定义新操作需要定义一个新的访问者,但是增加新元素就比较难了,每个访问者都要修改对新元素的支持。