首页计算机计算机软件设计模式 02 第二部分 行为型设计模式.pptx

02 第二部分 行为型设计模式.pptx

页数:42页文件大小:211.0 KB来源: 设计模式ppt课件

本课件进入行为型设计模式,先区分数据表示、接口与实现上的变化以及静态性、动态性与交互变化,再依次讲解策略、状态、中介者与观察者四种模式的意图、结构、效果与实现代码。

第二部分行为型设计模式目录,列出策略、状态、中介者、迭代器、命令与观察者等模式
行为型模式目录续页,列出访问者、备忘录、解释器与模板方法四种模式
行为变化分类页,区分数据表示变化、接口变化与实现变化,以及静态动态与交互上的变化
查看本课件的文字版(共 42 页,供检索与复制)

第1页:第二部分 行为型设计模式

第二部分行为型设计模式

  • 策略模式(Strategy Pattern)
  • 状态模式(State Pattern)
  • 中介者模式(Mediator Pattern)
  • 迭代器模式(Iterator Pattern)
  • 命令模式(Command Pattern)
  • 责任链模式(Chain of Responsibility Pattern)
  • 观察者模式(Observer Pattern)

第2页:行为型模式目录(续)

访问者模式(Vistor Pattern)

  • 备忘录模式(Memento Pattern)
  • 解释器模式(Interpreter Pattern)
  • 模板方法模式(Template Method Pattern)

第3页:行为的变化

行为的变化

  • 变化
  • 数据表示的变化
  • 行为的变化
  • 行为的变化与适应
  • 接口变化
  • 实现的变化
  • 静态性变化
  • 动态性变化
  • 交互上的变化

第4页:数据表示的变化

数据表示的变化

数据的类型、数量、可访问性、组织形式等class One {public:virtual ~One() { ….. }virtual void Do() { …. }private:int x;int y;Two * pTwo;};

第5页:接口的变化

接口的变化

  • 功能的增加
  • 功能的减少(OO均不支持)
  • 参数个数及类型的变化
  • 可访问性的变化
等等class One {public:virtual ~One() { ….. }virtual void Do() { …. }private:int x;int y;};class One {public:virtual ~One() { ….. }virtual void Do() { …. }virtual void Do2() { …. }private:int x;int y;};

第6页:实现中的静态性变化

实现中的静态性变化

  • 静态性变化体现
  • 类模版的实例化
具体类的行为静态性template <typename T >class One {public:virtual ~One() { ….. }virtual void Do(T& aT){ …. }private:T * pt;};#include “Two.h”One<Two> aOne;

第7页:具体类的行为静态性

具体类的行为静态性

  • 一旦具体类确定了,类的行为就确定了。即无论该类有多少个对象,各对象的行为完全一致,且在实例化时就确定了,而在运行期间不会改变。
  • 举例:
  • Do1的实现变化;
  • Do2的实现变化

第8页:只有Do1的实现改变

只有Do1的实现改变

第9页:Do1和Do2同时变化

Do1和Do2同时变化

第10页:具体类行为的动态性

具体类行为的动态性

  • 可以动态改变行为的执行结果
  • 根据:
  • 环境上下文、当前配置文件、系统状态
  • 客户的主观意愿,选择的策略等

第11页:交互上的变化

交互上的变化需要

  • 直接交互/间接交互?
  • 依赖型交互/关联型交互?
  • 交互的主动方和被动方?

第12页:行为模式主要针对

行为模式主要针对

  • 行为的静态性变化及适应
  • 行为的动态性变化及适应
  • 交互上的变化及使用

第13页:2.1 策略模式

2.1策略模式(Strategy Pattern)

  • 举例:一个扑克牌游戏中的玩家(Player),其行为:出牌。在其玩的过程中,若嫌电脑太笨,可能加大电脑的AI;若总是玩不过电脑,便可能选择较低难度的出牌方式。

第14页:策略模式意图

2.1.1策略模式意图

  • 定义多个实现或实现的一部分,并一一封装起来。
  • 在行为的动态执行过程中,可以替换各实现。
  • 这样,各实现可独立于使用者(客户)而变化。

第15页:策略模式示例

2.1.2例

第16页:策略模式适用性

2.1.3适用性

  • 只是行为上有差异,
  • 差异部分可动态替换(区别于静态变化适应方式)
  • 差异部分可能有更多的变体
  • 实现中以多个条件语句的形式区别不同的实质行为。

第17页:策略模式类图结构

2.1.4类图结构

第18页:策略模式效果

2.1.5策略模式效果

  • 封装一部分实现细节
  • 允许在不新建上下文(Context)的情况下,改变行为。
  • 允许相同的行为有不同的实现,而且可动态地选择并改变。

第19页:策略模式补充说明

2.1.6补充说明

  • 比较静态、动态行为变化
  • 可代替条件分支或case语句。
  • 具体策略的建立与绑定
  • Context与Strategy间的双向关联

第20页:2.2 状态模式

2.2状态模式(State Pattern)

  • 举例:一个TCPConnecttion,在接到客户请求时,将根据当前自身的状态,做出不同的反应。如,在Establised、Listening、Closed状态下,对Open、Close、Acknowledge等请求会有不同的反应。

第21页:状态模式意图

2.2.1状态模式意图

  • 使行为自动适应状态的改变
  • 去掉判断状态的分支语句

第22页:状态模式示例

2.2.2例

第23页:状态模式类图

2.2.3状态模式类图

第24页:状态模式效果

2.2.4状态模式效果

  • 将与行为相关的状态,单独抽象出来。
  • 状态改变时,使用者不用判断状态再执行相应的行为。
  • 状态的改变,可放在具体状态中实现,也可放在上下文(Context)中实现。
  • 状态对象的创建与销毁
  • 比较策略模式和状态模式

第25页:状态模式与策略模式对比

2.2.5对比策略模式

  • 一个扑克牌游戏中的玩家(Player),其行为:出牌。在其玩的过程中,若嫌电脑太笨,可能加大电脑的AI;若总是玩不过电脑,便可能选择较低难度的出牌方式。
  • 一个扑克牌游戏中的玩家(Player),其行为:出牌。在其玩的过程中,电脑玩家若快输了,可能采用激进的出牌方式;若基本赢定了,便可能选择较为保守的出牌方式。

第26页:2.3 中介者模式

2.3中介者模式(Mediator Pattern)

  • 例:一个系统中有多种类型的多种对象相互作用,共同完成系统的功能。

第27页:中介者模式意图

2.3.1中介者模式意图

  • 降低各类/对象间的耦合度,使得各类可独立地变化,增加复用性。
  • 使用一个中介对象封装各对象间的交互,并集中处理交互过程。

第28页:中介者模式类图

2.3.2中介者模式类图

第29页:中介者模式适用性

2.3.4中介者模式适用性

  • 多个对象定义良好,但通信复杂。此时相互间的依赖关系和关联关系复杂、混乱,不易理解。
  • 一个对象关联其它很多对象,并与相互通信,导致该对象难以维护和复用。
  • 一个行为的实现,需要其它多个类型的多个对象共同参与完成,但又不愿生成过多的子类。

第30页:中介者模式效果

2.3.5中介者模式效果

  • 好处
  • 将多对多的交互,改变成一对多的,易于维护和理解
  • 降低各Colleague间的耦合度
  • 集中处理对象间的交互和通信,不破坏对象的复用性
  • 不足
  • 大大增加了中介者类的复杂度
  • 中介者类难以复用

第31页:中介者模式的实现

2.3.6中介者模式的实现

  • 中介者与同事间通常是双向关联的。
  • 同事对象的创建与销毁
  • 抽象中介者的使用
  • 中介者与同事间的通信

第32页:2.4 观察者模式

2.4观察者模式(Observer Pattern)

  • 又名:订阅-发布模式
  • 例:一个时钟模型,当时间改变时,通知各显示界面,如以数字形式显示,或以表盘形式显示。

第33页:观察者模式意图

2.4.1观察者模式意图

  • 多个对象间是一种一对多的关系;
  • 当一个对象的状态改变时,所有依赖于它的对象都将得到通知,并自动更新;

第34页:观察者模式结构

2.4.2观察者模式结构无法显示该图片。

第35页:观察者模式变体

2.4.3观察者模式变体

第36页:观察者模式效果

2.4.4观察者模式效果

  • 目标与观察者间解耦(只在抽象层耦合)
  • 支持广播通信
  • 不足:更新可能出现意外

第37页:观察者模式的实现问题

2.4.5观察者模式的实现问题

  • 目标与观察者间的关联管理
  • 可直接关联,也可将关联关系存入一个Map表中
  • 目标可以多个。即二者为多对多关系。
  • 更新的触发

第38页:观察者模式代码一:Subject

2.4.6例子代码class Subject;class Observer{public:virtual ~Observer();virtual void Update(Subject * theChangedSubject) = 0;};

第39页:观察者模式代码二:Subject实现

class Subject {public:Subject( );virtual ~Subject( );virtual void Atach(Observer * obj ) {observers->Append(obj);}virtual void Detach(Observer * obj) {observers->Remove(obj);}virtual void Notify() {ListIterator<Observer *> i(observers);for( i.First(); !i.IsDone();i.Next()) {i.CurrentItem()->Update(this);}}private: List<Observer *> * observers;};

第40页:观察者模式代码三:ClockTimer

//具体的目标类ClockTimerclass ClockTimer:public Subject{public:ClockTimer( );virtual int GetHour();virtual int GetMinute();virtual int GetSecond();void Tick() {//记录当前时间Notify();}};

第41页:观察者模式代码四:时钟类

//具体的观察者类DigitalClockclass DigitalClock:public Observer {public:DigitalClock(ClockTiemr * theSubject){subject = theSubject;subject->Attach(this);}virtual ~DigitalClock(){subject->Detach(this);}virtual void Update(Subject * theChangedSubject){if(theChangedSubject == subject) {Draw();}}virtual void Draw() {int h= subject->GetHour();int m = subject->GetMinute();int s = subject->GetSecond();//绘制时钟,略}private: ClockTimer * subject;};

第42页:观察者模式客户代码

客户代码:ClockTimer * timer = new ClockTimer;AnalogClock * analogClock = newAnalogClock(timer);DigitalClock * digitalClock = newDigitalClock(timer);

顶部目录