行为型模式总结
行为型模式总结
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
行为型模式一共有11种:模板方法模式(Template Method)、策略模式(Strategy)、命令模式(Command)、中介者模式(Mediator)、观察者模式(Observer)、迭代器模式(Iteratior)、访问者模式(Visiter)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、状态模式(State)、解释器模式(Interpreter)。
模板方法模式的
定义
模板方法模式——在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
优缺点
优点:
实现了代码复用
能够灵活应对子步骤的变化,符合开放-封闭原则
缺点:因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
策略模式
策略模式(Strategy):定义了算法家族,分别封装起来,然他们之间相互替换。此模式让算法的变化,不会影响到使用算法的客户。
策略模式可以分为三类角色,分别为:抽象策略类(Strategy),具体策略类(ConcreteStrategy)、环境类(Context)
抽象策略类(Strategy):支持算法的抽象方法,是所有具体策略类的父类。
具体策略类(ConcreteStrategy):每一种具体的策略算法。
环境类(Context):使用具体算法的角色,根据客户端的情况,采用具体的的策略,定义所有的策略。
优点:扩展性提高,可灵活的扩展行为,且不会违背开闭原则。
策略可互相替换。
可以避免多重条件选择语句。
缺点:任何微小的变化就可能增加一个新的策略。
客户端不能使用多个策略类,客户端每次只能使用一个策略类,不支持使用一个策略类完成部分功能后再使用另一个策略类来完成剩余功能的情况。
命令模式
命令模式(Command):将一个请求封装为一个对象,从而是你可用不同的对象请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销操作命令模式大致分为四类:抽象命令类( Command)、具体命令类( ConcreteCommand)、调用者(Invoker)、接收者(Receiver)
调用者(Invoker):1、收集具体命令 2、调用具体命令的方法
抽象命令类( Command):所有命令实现的接口,声明执行命令的方法
具体命令类( ConcreteCommand):实现抽象命令类声明的方法,调用执行命令的方法
接收者(Receiver):执行各种命令。
优点:降低系统耦合度,将请求者和接收者分开。
可以将多个命令对象集合在一起。
缺点:多个具体命令类,导致系统复杂。
中介者模式
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
中介者模式大致分为四类,分别为抽象同事类(Colleague)、具体同事类(ConcreteColleague)抽象中介者(Mediator)、具体中介者(ConcreteMediator)
抽象同事类(Colleague):定义具体同事类的公有方法
抽象中介者(Mediator):声明一个接口,用于具体同事之间的通信
具体同事类(ConcreteColleague):1.先和通信者之间进行通信,2.通过中介者与其他具体同事类实现通信。
具体中介者(ConcreteMediator):协调各个具体同事者之间的通信。
优点:减少对象之间直接交互产生的错误,多个对象之间的交互(多对多),变成了通过中介者,形成了一对错的模式。
将各个同事时间接解耦,形成独立的类,使系统变得松耦合,可灵活的增加新的中介者以及具体同事类。
缺点:中介者承担角色任务重,中介者出现问题,导致系统崩溃。
增加新的具体同事类,需更改具体中介者类,违背了开闭原则,但是可以观察者和状态者模式可以更改该问题。
观察者模式
观察者模式定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖对象都会自动获得通知。观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。
观察者模式大致包括四类:抽象主题(Subject)、具体主题(ConcreteSubject)、抽象观察者(Observer)、具体观察者(ConcreteObserver)
抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
迭代器模式(Iteratior)
迭代器模式
定义:提供一种方法顺序的访问一个聚合对象的各个元素,而又不暴露该对象内部表示
角色:迭代器、集合
理解:把遍历集合的职能从集合本身转移到迭代器对象,不同的迭代器可以执行不同的遍历策略。
适用:1.需要访问组合对象的内容,而又不暴露其内部表示。2.需要通过多种方式遍历组合对象3.需要提供一个统一的接口,用来遍历各种类型组合对象。
访问者模式
定义:表示一个作用于某对象结构中的各元素的操作。它让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
角色:访问者(Vistor)接口、具体访问者、访问元素(Element)接口、具体元素
理解:1.元素对象通常是“部分-整体”结构中的节点。2.客户端创建一个ConcreteVistoer,把它传给一个ConcreteElement,ConcreteElement的所有集合都接受ConcreteVistoer的访问。
适用:
- 一个复杂的对象结构包含很多其他对象,它们有不同的接口,但是相对这些对象实施一些依赖于其具体类型的操作。
- 需要对一个组合结构中的对象进行很多不相关的操作,但是不想让这些操作污染这些对象的类。可将相关操作集中起来,定义在一个访问者类中,并在需要在访问者中定义的操作时使用它。
- 定义复杂的结构类很少作修改,但经常需要向其添加新的操作。
类图:
责任链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者与接受者之间的耦合关系。将这个对象连成一条链传递该请求,直到有一个对象处理它为止。
理解:对象引用同一类型的另一个对象,形成一条链。链中的每个对象实现了同样的方法,处理对链中第一个对象发起的同一个请求。
适用:
- 有多个对象可处理请求,而处理程序只有在运行时才能确定。
- 向一组对象发出请求,而不想现显式指定处理请求的特定处理程序。
九、备忘录模式
定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。、
角色:有三个角色:发起人(Originatior)、备忘录(Memento)、看管人(Caretaker)。
理解:发起人生成一个备忘录给看管人,看管人保存备忘录。当需要时,看管人获取备忘录交给发起人,发起人根据备忘录恢复自己。
十、状态模式
定义:允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎改变了它的类。
角色:有2个角色:环境(context)、状态(state)
理解:1.state可以理解为一个接口。2.context持有state的一个实例,动态的改state就动态的改了context的行为。
十一、解释器模式
定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
角色:环境(context)、解释器
理解:给定一个环境,创建不同的解释器并把环境传给解释器,不同的解释器对环境有不同的解释。
: