设计模式---总结(行为型)

前言:


什么是行为型?

行为型:可以理解为对象之间的一种通信,类和对象是怎么交互以及怎么分配职能的。


内容:


一、访问者模式


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

(2)理解:包括两个方面:元素层次(如:购物车中的各个商品)和访问者层次(买东西的人,检验员)

(3)图:

设计模式---总结(行为型)


抽象访问者:抽象类或者接口,抽象声明访问者可以访问哪些元素,访问者需要实现的操作方法。

访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。

抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素 一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。

元素类:实现抽象元素类所声明的accept()方法,完成对一个元素的访问操作。

结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set等;同时提供遍历其内部元素的方法。

(4)优缺点:

优点:将有关元素对象封装到一块便于不同的访问者访问;有良好的扩展性,增加新的访问操作容易

缺点:增加新的元素困难,破坏封装,违背了开闭原则。


访问者模式和迭代器模式?大家自己想想


二、模板方法模式:


(1)定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。(遵循逻辑结构,主逻辑放父类,剩余逻辑实现放子类)

(2)理解:不变的行为放在父类中,不同的方法实现放在子类中。例如:先抄试卷才能做题;试卷(不变的行为)---学生自己按照自己的想法去做题(不同的方法实现)

(3)图:

设计模式---总结(行为型)


抽象类:定义抽象的原语操作,具体的子类将重新定义并实现算法

具体子类:实现原语操作以完成与子类对应的相关步骤。

(4)优缺点:

优点:是一种代码复用的基本技术,将公共方法放入父类,子类使用时就可以提取出来,减少代码冗余;由于主要逻辑相同,很容易实现功能的扩展;维护方便

缺点:每个不同的实现都需要重新定义一个子类,增加了子类的个数,系统会越来越庞大

(5)总结:

是类之间的继承关系,没有对象关联;相同代码放在父类,将不同的方法实现放在子类中;将大部分不变逻辑声明在抽象类中,让不同的方法实现在子类(剩余逻辑)中得以实现。


三、策略模式


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

(2)理解:将对象本身和运算规则(算法)区分开来。例如:(出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,火车,飞机。每个策略都可以得到相同的觉果,但是他们使用了不同的资源。选择策略的一局是费用,时间,使用工具还有每种方式的方便程度。)

(3)图:

设计模式---总结(行为型)

封装类:使用算法的角色,用来维持一个对抽象策略类的引用实例,用于定义所采用的策略。

抽象策略:定义了所有支持的算法的公共接口,他为所支持的算法声明了抽象方法,是所有策略类的父类。

实现类:实现了抽象策略类中具体的算法。

(4)优缺点:

优点:策略类之间可以*切换;易于扩展,避免了使用多重条件语句(if ...else),便于维护。

缺点:客户端需要知道所有的策略类以及他们的区别,并自行选择使用;

(5)策略模式与状态模式区别:

策略模式:采用何种策略是有外部条件决定的;

状态模式:状态的变迁是有内部条件决定,强调对象内部状态的变化改变对象的行为。


四、状态模式:


(1)定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

(2)理解:例如:我们给一部手机打电话,就可能出现这几种情况:用户开机,用户关机,用户欠费停机,用户消户等。所以当我们拨打这个号码的时候:系统就要判断,该用户是否在开机且不忙状态,又或者是关机,欠费等状态。但不管是那种状态我们都应给出对应的处理操作。

(3)图:

设计模式---总结(行为型)

Context(环境类):它是拥有多种状态的对象;在环境类中维护一个抽象状态State的实例,这个实例定义当前的状态。

State(抽象状态类):定义一个接口以封装与环境类的一个特定状态相关的行为。在抽象类中声明了各种不同状态对应的方法,而在其子类中实现抽象类的这些方法。

ConcreteState(具体状态类):每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态对应环境的一个具体状态。

(4)优缺点:

优点:将所有与某个状态有关的行为放到一个类中;让多个环境对象,共享某个状态对象,减少对象个数;

缺点:状态模式必然会增加类和对象的个数;状态模式的结构和实现较为复杂,如果使用不当将导致程序结构和代码混乱。


五、观察者模式


我在这篇博客中已经总结好了:http://blog.csdn.net/tgbyn/article/details/71036314


六、备忘录模式


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

(2)理解:包括三个方面:

发起人(负责创建备和恢复忘录数据--可以理解为游戏角色)

备忘录(获得发起人当前状态,存储起来必要时提供内部状态)

管理者(对备忘录进行管理,保存和提供备忘录)

(3)图:

设计模式---总结(行为型)

(4)优缺点:

优点:发起人状态改变时,有可能需要回复以前的状态,可以利用备忘录模式还原。(电脑设置还原点,就应该是用了这个模式);实现了对信息的封装

缺点:成员数量多,占用空间大,消耗很多资源
(5)适用:

保存一个对象在某个时刻的全部状态或部分状态,这样以后需要时他能够恢复到先前的状态,实现撤销操作。