常用设计模式——行为型

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6515573.html

一:命令模式

 

 

调用者发出请求命令——请求命令类调用接收者的处理方法

 

 

 

请求者发出请求——导致命令对象被创建——命令对象调用执行函数——执行函数中调用接收对象的处理函数

实例:

 

请求者:遥控器

接收者:电视

命令对象:开电视、关电视、换频道,分别调用了电视的开、关、换频道

二:访问者模式

即:把对某一种数据对象的操作集合起来成为一个操作类。

抽象访问者:定义了有哪些操作方法

具体访问者:针对具体的对象制定具体操作方法

抽象元素:定义了对象的大致构成

具体元素:定义了对象的具体构成、具体操作,而操作是通过调用相应的具体访问者的操作方法来实现的

对象结构:相当于一个容器,用来addremove具体的对象,并指定具体的访问者,然后在方法中通过具体访问者调用方法来处理对象们

三:中介者模式

抽象中介类:定义了一系列中介者需要有的成员与方法:一个成员List,统一管理所有连接到该中介者的对象;addremove对象的方法;遍历各对象执行对象方法调用的方法;

具体中介类:实现具体的addremove、遍历方法

同事类(被中介调停的类):定义具体的功能方法(如:修改属性、某些操作)

 

这里,聊天室就是中介,Member有两个,普通会员和钻石会员,他们各自的sendXX方法不同,chatroom成员则标识当前member是属于哪个聊天室的。在相应的聊天室类对象中保存着所有连接到它这的member们,并且检测到有member发送信息过来就逐个泛洪到其他member中去。

四:职责链模式

职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

 

Handler:抽象处理者类,定义了一个指向下一个处理者的指针,以及当前的处理方法

具体处理者:实现具体的处理方法:如果当前对象能处理请求则处理好并返回结果,如果不能,则把请求发给下一个处理者对象:(调用成员(下一个处理者)的处理方法)

五:观察者模式:一系列对象根据一个被观察对象的行为而做出不同反应

建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。

适用情况:

一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

一个对象必须通知其他对象,而并不知道这些对象是谁。

需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

观察者模式包含如下角色:

Subject: 被观察的目标的抽象,定义连接方法(管理观察者们)、接触连接(移除一个观察者)、通知方法(遍历观察者数组,向他们传递一个信号)

ConcreteSubject: 具体目标,实现subject,把具体的管理、移除、通知方法实现出来。

Observer: 观察者抽象,定义一个抽象的响应观察目标信号的相应行为方法()

ConcreteObserver: 具体观察者,实现observer接口,把该子类具体的响应行为实现出来。

猫被老鼠、狗观察,猫叫(发出信号),老鼠跑,狗叫(响应)

通知的实现:

观察者类中定义一个函数作为响应函数(执行数据修改等响应),然后在观察目标中定义一系列的观察者对象,在某事件触发下(如:datachange()),则通知观察者改变(遍历观察者对象数组,通过 对象.response() 调用响应函数执行相应的响应操作)。

六:策略模式

传统的子类继承父类来扩展功能的做法,依赖性太强。修改父类,则所有子类都会受影响。而子类之间同名函数又可能有不同实现。此时,可以用策略模式来自定制子类的特色功能。
 
适用情况:
子类们有特有的需求,而且子类之间同名的行为又有各自的特性。
 
抽取变化:
策略策略,顾名思义就是根据不同需求变化采取不同的应对,所以,策略模式的第一步,就是把变化抽取出来。
比如:鸭子(父类)的子类有绿头鸭、红头鸭、玩具鸭,绿头鸭和红头鸭有叫、飞、游的行为,而玩具鸭只有叫的功能。如果在父类中定义这三种动作,则连玩具鸭都默认有了飞、游行为了,所以要抽取出来。此时,得出变化:飞、游。
规律:比较子类之间行为的不同,得出不定的、变化的行为集。
 
处理变化:
策略模式解决变化的方法是,用一个接口,定义宏观上的一种行为(比如:飞),其中封装一个行为方法(fly())。然后通过各种行为子类去实现该接口,并实现具体的行为方法(slowfly()/quickfly())。而在父类中,定义一系列行为接口变量(Fly fly),并在父类的行为方法中调用接口变量的同名方法来实现行为(void fly(){fly.fly();})。在继承父类的子类中再为接口变量指定具体的行为子类(fly=new slowfly()),则此时为父类各种方法中用行为接口调用方法的那个接口进行了明确指定。
实质:接口的向上转型的应用。
 
1、分析项目中变化部分与不变部分
2、用行为接口而少用继承;用行为类组合,而不是行为的继承。
原文地址:https://www.cnblogs.com/ygj0930/p/6515573.html