行为模式.ppt
《行为模式.ppt》由会员分享,可在线阅读,更多相关《行为模式.ppt(253页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、行为模式行为模式n行为模式涉及到算法和对象间职责的分配n描述对象或类的模式n描述它们之间的通信模式行为类模式n使用继承机制在类间分派行为nTemplate Methodn模板方法是一个算法的抽象定义n子类定义抽象操作以具体实现该算法nInterpretern将一个文法表示为一个类层次行为对象模式n使用对象复合n类型1:n描述一组对等的对象怎样相互协作n问题:对等的对象如何了解对方?nMediatornChain of ResponsibilitynObserver行为对象模式n类型2n将行为封装在一个对象中并将请求指派给它nStrategynCommandnStatenVisitor5.1 C
2、hain of Responsibility 职责链1.意图n使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系n将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。2.动机n图形用户界面中的Context有关的帮助机制n根据普遍性(generality)组织帮助信息n从最特殊到最普通n提交请求的对象不知道谁是最终提供响应的对象n使用Chain of Responsibility模式,使得请求者和响应者解耦(decouple)2.动机n隐式的接收者(implicit receiver)2.动机3.适用性n有多个对象可以处理一个请求n哪个对象处理该请求,由
3、运行时刻自动确定n在不明确接收者的情况下,向多个对象中的一个提交一个请求n可处理一个请求的对象集合应被动态指定4.结构5.参与者nHandler(HelpHandler)n定义一个处理请求的接口n(可选)实现后继链nConcreteHandler(PrintButton,PrintDialog)n处理它所负责的请求n可访问它的后继者n如果可处理请求,则处理;否则将请求转发给它的后继者nClientn向链上的具体处理者(ConcreteHandler)对象提交请求9.协作n当客户提交一个请求时,请求沿链传递直至有一个ConcreteHandler对象负责处理它7.效果1)降低耦合度n接收者和发送
4、者都没有对象的明确信息,且链中的对象不需知道链的结构n职责链可简化对象的相互连接n仅需保持一个指向后继者的引用n不需保持所有候选接受者的引用7.效果2)增强了给对象指派职责(Responsibility)的灵活性n在运行时刻对职责链进行动态增加和修改3)不保证被接受n一个请求,不能保证它一定会被处理8.实现1)实现后继者链a)定义新的链接e.g.使用Handler类b)使用已有的链接 e.g.复用Composite模式中的链等8.实现2)连接后继者Handler不仅定义请求的接口,也维护后继链接8.实现3)表示请求n方式1:硬编码(hard-coded)的操作调用n方便、安全;n只能处理Han
5、dler类中定义的固定的一组请求n方式2:使用一个处理函数n处理函数以一个请求码为参数n优点:更为灵活n缺点:无法用类型安全的方法传递请求参数8.实现用独立的请求对象来封装请求参数8.实现子类扩展9.代码示例HelpHandler类检索是否存在相关的帮助主题9.代码示例窗口组件类 Widget9.代码示例Button类9.代码示例Dialog类9.代码示例Application类9.代码示例Client11.相关模式n职责链常与Composite模式一起使用n一个组件的父组件可作为它的后继5.2 Command 命令Command模式1.意图n将一个请求封装为一个对象,从而可用不同的请求对客户
6、进行参数化n对请求排队或记录请求日志,以及支持可撤销的操作2.别名 动作(Action)事务(Transaction)3.动机有时必须向某对象提交请求,但并不知道被请求的操作或者请求的接受者的信息应用为每个菜单项配置一个Command对象3.动机PasteCommand对象3.动机OpenCommand3.动机宏命令:命令序列3.动机n菜单和按钮代表同一功能n共享Command对象n命令脚本(command scripting)n提交一个请求的对象n仅需知道如何提交它n不需知道该请求将会被如何执行4.适用性n抽象出待执行的动作以参数化某对象ncallbackn在不同的时刻指定、排列和执行请求n
7、支持取消操作n支持修改日志n用构建在原语操作上的高层操作构造一个系统nTransaction事务5.结构6.参与者nCommandn声明执行操作的接口nConcreteCommand(PasteCommand,OpenCommand)n将一个接收者对象绑定于一个动作n调用接收者相应的操作,以实现ExecutenClient(Application)n创建一个具体命令对象并设定它的接收者nInvoker(MenuItem)n要求该命令执行这个请求nReceiver(Document,Application)n知道如何实施与执行一个请求相关的操作n任何类都可能作为一个请求者7.协作8.效果n将调用
8、操作的对象(Invoker)与知道如何实现该操作的对象(Receiver)解耦nCommand可以像其他对象一样操作以及扩展n多个命令装配成一个复合命令nComposite模式n增加新的Command很容易,无需改变已有的类9.实现1)一个Command对象应达到何种智能程度n命令对象的能力可大可小n仅确定一个接收者和执行的动作或nCommand对象自己实现所有功能,不需要额外的接收者对象n普通情况:nCommand对象有足够的信息可以动态找到它们的接收者9.实现2)支持取消(undo)和重做(redo)nCommand提供reverse操作(Unexecute或者Undo操作)n此时,Con
9、creteCommand类需要额外的状态信息n接收者对象,其上执行的操作n接收者上执行操作的参数n如果该操作改变了接收者对象的值,则需要存储这些值n接收者需要提供操作,以便恢复到先前状态9.实现2)支持取消(undo)和重做(redo)n已执行命令的历史序列(history list)n向后遍历:undon向前遍历:redon如果命令的状态在各次调用之间会发生变化,则必须进行拷贝以区分不同调用ne.g.DeleteCommand命令对象9.实现3)避免取消操作过程中的错误积累n在Command中存入更多的信息以保证这些对象被精确复原成其初始状态nMemento模式4)使用C+模板 对(1)不能
10、撤销(2)不需要参数的命令,可使用C+模板来实现10.代码示例抽象Command类10.代码示例OpenCommand10.代码示例PasteCommand10.代码示例使用类模板处理简单命令(不能取消、不需参数)10.代码示例MacroCommand:子命令序列管理子命令12.相关模式nComposite模式:用于实现宏命令nMemento模式n用来保存某个状态,Command对象使用此状态来实现撤销操作n在被放入历史列表前必须被拷贝的Command起到原型(prototype)的作用5.3 Interpreter 解释器1.意图n给定一个语言,定义它的文法的一种表示n定义一个解释器,这个解
11、释器使用该表示来解释语言中的句子2.动机n字符串模式匹配n解释执行一个正则表达式n解释器模式描述了n如何为简单的语言定义一个文法n如何在该语言中表示一个句子n如何解释这些句子2.动机n正则表达式2.动机2.动机抽象语法树raining&(dogs|cats)*3.适用性n该文法简单n对于复杂的文法,需要使用语法分析程序生成器之类的n效率不是一个关键问题4.结构图5.参与者nAbstractExpression(抽象表达式)n声明一个抽象的解释操作,这个接口被抽象语法树中所有的节点共享nTerminalExpression(终结符表达式)n实现与文法中的终结符相关联的解释操作n一个句子中的每个终
12、结符需要该类的一个实例nNonterminalExpression(非终结符表达式)n针对文法中的规则nContext 上下文n包含解释器之外的一些全局信息nClientn构建抽象语法树n调用解释操作6.协作nClient构建(或被给定)一个句子n它是NonterminalExpression 和TerminalExpression对象的一个抽象语法树n然后初始化上下文并调用解释操作n每一非终结符节点定义相应子表达式的解释操作。终结符节点的解释操作是递归的基础n每一节点的“解释操作”作用Context来存储和访问解释器的状态7.效果1)易于改变和扩展文法n使用继承来改变或扩展文法2)易于实现文
13、法n易于编写抽象语法树中各个节点对应的类n也可用编译器或语法分析程序生成器自动生成7.效果3)复杂的文法难以维护n解释器模式中,每个规则至少定义一个类4)增加了新的解释表达式的方式nAbstractExpression上除了Interpret操作外,可以增加新的操作n可以考虑Visitor模式8.实现1)创建抽象语法树n解释器模式不涉及语法分析n未解释如何创建一个抽象语法树n可行的方式n用一个表驱动的语法分析程序来生成n用手写的(递归下降法)语法分析程序创建n直接由Client提供8.实现2)定义解释操作n不一定要在表达式类中定义解释操作n可使用Visitor模式3)以Flyweight模式共
14、享终结符9.代码示例n对布尔表达式进行操作和求值两个操作:1.求值2.替换(replace):用一个表达式来替换一个变量以产生新的表达式9.代码示例父类上下文9.代码示例变量替换9.代码示例And操作求值9.代码示例And操作9.代码示例求值9.代码示例n替换11.相关模式nComposite模式n抽象语法树是复合模式的实例nFlyweight模式n如何在抽象语法树中共享终结符nIteratorn解释器用一个迭代器进行遍历nVisitorn将解释操作独立出来5.4 Iterator 迭代器Iterator模式1.意图n提供一种方法顺序访问一个聚合对象中各个元素n不需暴露该对象的内部表示2.别名
15、 游标(Cursor)3.动机将“对列表的访问和遍历”从列表对象中分离出来此时,迭代器和列表耦合3.动机多态迭代(polymorphic iteration)Factory Method4.适用性n访问一个聚合对象的内容而无需暴露它的内部表示n支持对聚合对象的多种遍历n为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)5.结构6.参与者nIterator n定义访问和遍历元素的接口nConcreteIteratorn实现Iterator接口n对聚合对象遍历时追踪当前位置nAggregaten定义创建相应Iterator对象的接口(CreateIterator)nConcreteAggr
16、egaten实现Aggregate接口nCreateIterator操作返回一个适当的Iterator实例7.协作nConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象8.效果1)支持以不同的方式遍历一个聚合n更换迭代器实例即可处理不同的遍历算法2)迭代器简化了聚合的接口n聚合本身不需提供遍历接口3)在同一个聚合上可以有多个遍历n每个迭代器保持它自己的遍历状态9.实现1)谁控制该迭代 迭代器 or client?n外部迭代器(external iterator)client控制nClient需要主动推进遍历的步伐(next)n使用灵活n内部迭代器(internal
17、 iterator)迭代器控制nClient向iterator提交一个操作,迭代器对聚合中每个元素实施该操作n使用简单,client不需考虑迭代逻辑9.实现2)谁定义遍历算法 迭代器 or 聚合n聚合中定义遍历算法n用迭代器存储当前迭代的状态n此时迭代器仅用来只是当前位置,称为“游标”Cursorn迭代器负责遍历算法n优点:易于在相同聚合上使用不同的迭代算法,或在不同的聚合上重用相同的算法n缺点:遍历算法可能需要访问聚合的私有变量,因此将遍历算法放入迭代器可能会破坏聚合的封装性9.实现3)迭代器健壮程度如何n遍历的同时存在修改(增加或删除聚合元素)可能导致遍历出现问题n简单解决方法:n遍历时拷
18、贝聚合,然后对拷贝进行遍历n问题:代价太高n健壮的迭代器(robust iterator)n保证插入合删除操作不会干扰遍历,且不需拷贝聚合n方案:n向聚合注册迭代器n聚合修改时,调整迭代器内部状态,或在内部维护额外信息以保证正确遍历9.实现4)附加的迭代器操作n迭代器最小接口:nFirst,Next,IsDone,CurrentItemn其他操作nPrevious:前一个nSkipTo:定位9.实现5)在c+中使用多态的迭代器n多态迭代器使用n使用Factory Method动态分配迭代器对象(有代价)n一般情况下,可以直接在栈中分配具体的迭代器n问题:Client必须负责删除多态迭代器n使用
19、Proxy模式以便保证迭代器一定被删除9.实现6)迭代器可有特权访问n迭代器和聚合紧密耦合nC+中,可以将迭代器作为聚合类的friend类n问题:使用这种方式,增加新的遍历时,需要在聚合中加入新的友元n解决:n迭代器类中包含一些protected操作访问聚合类的非public成员n迭代器子类使用这些protected操作9.实现7)用于复合对象Composite的迭代器n在递归聚合结构上n外部迭代器可能难以实现n需要为跟踪当前的对象存储一个路径n使用内部迭代器n内部迭代器进行递归调用n路径信息隐式存储在调用栈中n如果节点提供访问其他节点的接口(兄弟、父、子),则可以使用基于游标的迭代器n用游标
20、跟踪当前节点9.实现8)空迭代器NullIteratorn退化的迭代器,有助于处理边界条件nIsDone总返回truen有助于遍历树形结构n每个节点返回一个Iterator对象n叶节点方法NullIterator对象10.代码示例1)列表与迭代接口访问元素接口,足以进行遍历操作因此不再提供专门的特权操作2)迭代器子类3)使用迭代器4)避免限定于一种特定的列表实现SkipList提供一个SkipListIterator(与具体List实现有关)其中定义一个Factory Method也可以单独定义一个类Traversable,其中定义一个CreateIterator接口4)避免限定于一种特定的列
21、表实现AbstractList的子类不依赖于具体列表表示5)保证迭代器被删除n使用代理机制,保证释放迭代器重载操作符禁止进行copy和赋值操作5)保证迭代器被删除Client的使用离开作用域后,iterator会被释放6)一个内部的ListIteratorn内部ListIteratorn由迭代器来控制迭代n对列表中每个元素实施同一个操作n抽象的迭代器,C+中的实现方法n给迭代器传递一个函数指针n依赖子类生成6)一个内部的ListIterator供子类重定义的操作6)一个内部的ListIterator6)一个内部的ListIterator子类派生(重载ProcessItem操作)6)一个内部的L
22、istIterator使用内部Iterator使用外部Iterator6)一个内部的ListIterator使用内部迭代器封装不同的迭代只有通过测试的元素才进行处理12.相关模式nCompositen迭代器的应用对象nFactory Methodn多态迭代器使用Factory MethodnMementon迭代器使用memento来存储迭代的状态5.5 Mediator 中介者1.意图n用一个中介对象来封装一系列的对象交互n中介者使各对象不需要显式地相互引用n从而使其耦合松散n可以独立地改变它们之间的交互2.动机n对象间的相互连接会降低可复用性 对于不同的对话框,有不同的窗口组件间的依赖关系。
23、两个对话框显示相同类型的窗口组件2.动机将集体行为封装在一个单独的中介者(mediator)对象中2.动机各对象如何协作处理一个列表框中选项的变化2.动机3.适用性n一组对象以定义良好但是复杂的方式进行通信。产生的依赖关系结构混乱且难以理解。n一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象n想定制一个分布在多个类的行为,而又不想生成太多的子类。4.结构4.结构5.参与者nMediator 中介者n定义一个接口,用于和各同事(colleague)对象通信nConcreteMediatorn具体中介者通过协调各同事对象实现协作行为n了解并维护它的各同事nColleague cl
24、ass 同事类n每个同事类都知道它的中介者对象n每个同事对象在需要与其他同事通信时,与它的中介者通信6.协作n同事向一个中介者对象发送和接收请求n中介者在各同事间适当地转发请求以实现协作行为7.效果1)减少了子类生成n有利于Colleague类的重用2)将各Colleague解耦n可以独立改变和复用Mediator/Colleague3)简化了对象协议nColleague间的多对多 Mediator与Colleague间的一对多7.效果4)对对象如何协作进行了抽象n用独立的对象处理一个系统的各个对象的交互5)使控制集中化n将交互的复杂性变为中介者的复杂性n可能使得中介者本身很复杂,难于维护8.
25、实现1)忽略抽象的Mediator类n仅存在一个Mediator时2)Colleague-Mediator通信n实现方式1:Observer模式n实现方式2n在Mediator中定义一个特殊的通知接口9.代码示例导控者父类9.代码示例窗口组件父类导控者指针onChange事件Widget子类9.代码示例具体的Mediator9.代码示例跟踪窗口组件9.代码示例处理组件间的协同11.相关应用nFacadenFacade是单向的nMediator是多向的nObservernColleague可以使用Observer模式与Mediator通信5.6 Memento 备忘录Memento模式1.意图n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 行为 模式
限制150内