行为型软件设计模式.ppt_第1页
行为型软件设计模式.ppt_第2页
行为型软件设计模式.ppt_第3页
行为型软件设计模式.ppt_第4页
行为型软件设计模式.ppt_第5页
已阅读5页,还剩174页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 行为模式,行为模式涉及到算法和对象间职责的分配 are concerned with algorithms and the assignment of responsibilities between objects. describe the patterns of communication between objects or classes. characterize complex control flow.(刻划了在运行时难以跟踪的复杂的控制流) 行为类模式:使用继承在类间分配行为。 行为对象模式:对象之间如何相互协作以完成单个对象无法完成的任务。 行为模式(11种),Me

2、diator(中介者) Memento(备忘录) Observer(观察者) State(状态) Strategy(策略) Template method(模板方法) Visitor(访问者),ChainOf Responsibility(职责链) Command(命令) Interpreter(解释器) Iterator(迭代器),5.1 Chain Of Responsibility(职责链) 对象行为型模式,意图 使多个对象都有机会处理请求。 Avoid coupling the sender of a request to its receiver by giving more tha

3、n one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.,5.1 Chain Of Responsibility(职责链) 对象行为型模式,动机 一个图形用户界面中的上下文有关的帮助机制。 用户在界面的任何部位上点击就可得到帮助信息。 所得到的帮助信息依赖于点击的是界面的哪一部分及其上下文。 在众多界面对象中必须有一个来处理帮助请求 是谁呢? 帮助信息的组织:从最具体到最一般。,

4、Motivation,将处理对象连成一条链,请求沿链传递,直至被处理. 客户不知道具体的处理对象是谁.,要求: 每个在链上的对象都有一致的处理请求和访问链上后继者的接口。 如上图,按钮、对话框和应用类都使用HelpHandler操作处理帮助请求。 缺省实现是将请求转发给后继者。 子类可重定义该操作提供处理。,5.1 Chain Of Responsibility(职责链) 对象行为型模式,适用性 有多个对象可以处理同一请求,具体由谁处理需要在运行时刻确定。 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 You want to issue a request to one o

5、f several objects without specifying the receiver explicitly. 可处理一个请求的对象集合应被动态指定。 The set of objects that can handle a request should be specified dynamically.,结构,Handler 定义一个处理请求的接口。 实现后继链 (可选) ConcreteHandler 处理它所负责的请求 可访问其后继者 forward to successor if it cant handle the request Client initiates the

6、 request to the first ConcreteHandler in the chain.,典型的对象结构,5.1 Chain Of Responsibility(职责链) 对象行为型模式,协作 当客户提交一个请求时,请求沿链传递直至有一个ConcreteHandler对象负责处理它。,5.1 Chain Of Responsibility(职责链) 对象行为型模式,效果 降低耦合度。 receiver and sender have no explicit knowledge of each other can simplify object interactions 增强了给对

7、象指派职责的灵活性。 can add or change responsibilities by changing the chain at run-time. 不保证被接受。 request may fall off the end of the chain,5.1 Chain Of Responsibility(职责链) 对象行为型模式,实现 实现后继者链 定义新的链接 使用已有的链接 连接后继者。 缺省实现:向后继者转发请求。 表示请求。 硬编码的操作调用 一个处理函数,参数为一个请求码。 需要用条件语句来区分请求代码。 无法用类型安全的方法传递参数。 使用独立的请求对象来封装请求参数。

8、 分派函数 P151 子类可通过重定义HandleRequest扩展该分派函数。,5.1 Chain Of Responsibility(职责链) 对象行为型模式,代码示例 P152-154。 相关模式 职责链常与Composite一起使用。 一个构件的父构件可作为它的后继。,5.2 Command(命令) 对象行为型模式,意图 将一个请求封装为一个对象,使得: 可用不同的请求对客户进行参数化 parameterize clients with different requests 对请求排队或记录请求日志 queue or log requests 支持可撤销的操作 support undo

9、able operations 别名 动作,事务,5.2 Command(命令) 对象行为型模式,动机 图形按钮和菜单 用来响应用户输入,执行请求。 工具箱的设计者无法知道请求的接收者或可执行的操作。 只有使用工具箱的应用知道该由哪个对象做那个操作。,5.2 Command(命令) 对象行为型模式,动机 命令模式 通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求。 这个对象可被存储并像其他对象一样被传递。,每一个菜单中的选项都是一个菜单项MenuItem的实例。 一个Application实例创建这些菜单和相应菜单项以及其它用户界面,跟踪打开的Document对象。 该应用

10、为每个菜单项配置一个具体的Command子类的实例 当用户选择一个菜单项时,该MenuItem对象调用它的Command对象的Execute方法,而Execute执行相应操作。 MenuItem对象并不知道他们使用的是Command的哪个子类。Command子类里存放着请求的接收者,而Execute操作调用该接收者的一个或多个操作。,例1:PasteCommand的接收者是一个文档对象,该对象是实例化时提供的。,例2:OpenCommand的接收对象是Application实例。,复合命令:或称宏命令。 MacroCommand是一个具体的Command子类,它执行一个命令序列。 MacroC

11、ommand没有明确的接收者,而序列中的命令各自定义自己的接收者。,5.2 Command(命令) 对象行为型模式,适用性 parameterize objects by an action to perform,代替回调。 Command模式是回调机制的一个面向对象的替代品。 在不同时刻指定、排列和执行请求。 specify, queue, and execute requests at different times 。 一个Command对象可以有一个与初始请求无关的生存期。 support undo Command接口添加Unexecute 操作。 保存当前状态。 建立历史命令列表。,

12、5.2 Command(命令) 对象行为型模式,适用性 支持修改日志,当系统崩溃时,这些修改可重做一遍。 support logging changes so that they can be reapplied in case of a system crash。 用构建在原语操作上的高层操作构造一个系统 structure a system around high-level operations built on primitives operations transactions Command模式提供了对事务进行建模的方法。,结构,create,set,Holds command,T

13、ransforms: concreteReceiver.action() in command.execute(),5.2 Command(命令) 对象行为型模式,参与者 Command 声明执行操作的接口。 ConcreteCommand(PasteCommand) 将一个接收者对象绑定于一个动作 调用接收者相应操作,以实现Execute。 Client(Application) 创建一个具体命令对象并设定它的接收者。 Invoker(MenuItem) 要求该命令执行这个请求。 Receiver(Document,Application) 知道如何实施与执行一个请求相关的操作。任何类都可能

14、作为一个接收者。,协作,5.2 Command(命令) 对象行为型模式,效果 1、Command模式将调用操作的对象与知道如何实现该操作的对象解耦。 Decouples Invoker from Receiver 2、Command是头等对象。 Commands are first-class objects can be manipulated and extended 3、可将多个命令装配成一个复合命令 4、增加新的Command子类很容易。 Potential for an excessive number of command classes,5.2 Command(命令) 对象行为型

15、模式,实现 1、一个命令对象应达到何种智能程度 “Dumb”:仅确定一个接收者和执行该请求的动作 delegate everything to Receiver used just to decouple Sender from Receiver “Genius”:自己实现所有功能 does everything itself without delegating at all useful if no receiver exists let ConcreteCommand be independent of further classes “Smart”:介于上面两个极端之间 find re

16、ceiver dynamically,5.2 Command(命令) 对象行为型模式,实现 2、支持取消(Undo)和重做(Redo) Need to store additional state to reverse execution receiver object parameters of the operation performed on receiver original values in receiver that may change due to request receiver must provide operations that makes possible fo

17、r command object to return it to its prior state History list:支持多级的取消和重做 sequence of commands that have been executed used as LIFO with reverse-execution undo used as FIFO with execution redo Commands may need to be copied when state of commands change by execution,5.2 Command(命令) 对象行为型模式,实现 3、避免取消操

18、作过程中的错误积累,5.2 Command(命令) 对象行为型模式,实现 4、使用C+ 模板实现: 既不能被取消,也不需要参数的简单命令 Works only for simple commands! if action needs parameters or command must keep state use a Command subclass! P160 代码,5.2 Command(命令) 对象行为型模式,代码示例 P159P161,5.2 Command(命令) 对象行为型模式,相关模式 Composite模式可用来实现command组合 为实现undo/redo,可以用其他行为

19、模式来管理状态,如memento模式。Command被放到history list之前,可以用prototype模式复制自身,5.3 Interpreter(解释器) 类行为型模式,意图 给定一种语言,定义它的一种文法表示。定义一个解释器,这个解释器使用该表示来解释语言中的句子。 Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.,5.3 In

20、terpreter(解释器) 类行为型模式,动机 如果一种特定类型的问题发生频率很高,就值得将该问题的各个实例表达成一个简单语言的句子。再构造一个解释器,通过解释这些句子来解决具体问题。 常见问题:搜索匹配一个模式的字符串。 用正则表达式表示待匹配的字符串集合。 使用通用搜索算法,5.3 Interpreter(解释器) 类行为型模式,动机 解决3个方面的问题 1、如何为简单的语言定义一个文法? 例子:为正则表达式定义一个文法。 2、如何在该语言中表示一个句子? 例子:如何表示一个具体的正则表达式。 3、如何解释这些句子? 例子:如何解释这个具体的正则表达式。,5.3 Interpreter(

21、解释器) 类行为型模式,动机 第1个问题:正则表达式的文法,expression := literal | alternation | sequence | repetition | ( expression ) alternation := expression | expression sequence := expression public Object next(); public void remove(); public interface java.util.Collection . / List, Set extend Collection public Iterator i

22、terator(); public interface java.util.Map . public Set keySet(); / keys,values are Collections public Collection values(); / (can call iterator() on them) ,Iterators in Java,all Java collections have a method iterator that returns an iterator for the elements of the collection can be used to look th

23、rough the elements of any kind of collection (an alternative to for loop) List list = new ArrayList(); . add some elements . for (Iterator itr = list.iterator(); itr.hasNext() BankAccount ba = (BankAccount)itr.next(); System.out.println(ba); ,set.iterator() map.keySet().iterator() map.values().itera

24、tor(),Adding your own Iterators,when implementing your own collections, it can be very convenient to use Iterators discouraged (has nonstandard interface): public class PlayerList public int getNumPlayers() . public boolean empty() . public Player getPlayer(int n) . preferred: public class PlayerLis

25、t public Iterator iterator() . public int size() . public boolean isEmpty() . ,5.5 Mediator(中介者)-对象行为型模式,意图 用一个中介对象封装一系列的对象交互 Defines an object that encapsulates how a set of objects interact. 使相互之间松散耦合 promotes loose coupling by keeping objects from referring to each other explicitly 可以独立地改变之间的交互 l

26、ets you vary their interaction independently,5.5 Mediator(中介者)-对象行为型模式,动机 面向对象设计鼓励将行为分布到各个对象之中。 导致对象之间的联系增多 降低复用性,5.5 Mediator(中介者)-对象行为型模式,动机 举例:字体选择对话框,窗口组件之间存在依赖关系。 不同对话框会有不同的依赖关系 即使组件相同,也不能简单重用已有的窗口组件类,5.5 Mediator(中介者)-对象行为型模式,动机 解决方案 将集体行为封装在一个单独的中介者对象中 中介者负责控制和协调一组对象之间的交互 中介者充当一个中介以使组中的对象不再相互

27、显式引用,5.5 Mediator(中介者)-对象行为型模式,动机 处理列表框中选项的变化,5.5 Mediator(中介者)-对象行为型模式,动机 FontDialogDirector抽象怎样被集成到一个类库中,5.5 Mediator(中介者)-对象行为型模式,适用性 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。 想定制一个分布在多个类中的行为,而又不想生成太多子类。,5.5 Mediator(中介者)-对象行为型模式,结构,Mediator(中介者):定义一个接口用于与各同事对象通信

28、。 ConcreteMediator(具体中介者):协调各同事对象实现协作行为。 Colleague类:1、每个同事类都知道它的中介者对象。 2、每个同事对象需要与其他同事通信时,与中介者联系。,5.5 Mediator(中介者)-对象行为型模式,协作 同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。,5.5 Mediator(中介者)-对象行为型模式,效果 1 减少了子类生成 Mediator将原本分布于多个对象间的行为集中到一起。改变这些行为只需生成Mediator的子类即可。 localizes behaviour that otherwise woul

29、d need to be modified by subclassing the colleagues 2 将各Colleague解耦 can vary and reuse colleague and mediator classes independently 3 简化了对象协议 replaces many-to-many interactions with one-to-many one-to-many are easier to deal with,5.5 Mediator(中介者)-对象行为型模式,效果 4 它对对象如何协作进行了抽象 lets you focus on how obj

30、ects interact apart from their individual behavior. That can help clarify how objects interact in a system. 5 它使控制集中化 Because a mediator encapsulates protocols, it can become more complex than any individual colleague. This can make the mediator itself a monolith(庞然大物) thats hard to maintain.,5.5 Me

31、diator(中介者)-对象行为型模式,实现 1 忽略抽象的Mediator类 仅需要一个Mediator时 2 ColleagueMediator通信 Mediator作为Observer,各个Colleague作为Subject,一旦其状态改变就发送通知给Mediator。Mediator作出的响应是将状态改变的结果传播给其他的Colleague。 在Mediator中定义一个特殊的通知接口,各Colleague在通信时直接调用该接口。,5.5 Mediator(中介者)-对象行为型模式,代码示例 P185-187,5.6Memento(备忘录)-对象行为型模式,意图 在不破坏封装性的前提

32、下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 Without violating encapsulation, capture and externalize an objects internal state so that the object can be restored to this state later. 别名 Token,5.6Memento(备忘录)-对象行为型模式,动机 为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制。 要实现这些机制,必须事先将状态信息保存在某处。 对象的状态信息一般是封装的

33、,不允许其他对象直接访问。 暴露其内部状态,将违反封装原则。,5.6Memento(备忘录)-对象行为型模式,动机 一个图形编辑器,支持图形对象间的连线。 在移动一个矩形的过程中,编辑器能自动伸展这条直线以保持该连接。 使用了约束解释系统。P188,5.6Memento(备忘录)-对象行为型模式,动机 一个图形编辑器,支持图形对象间的连线。 每次移动时保存移动的距离,往往不能精确恢复。 为重建先前状态,取消机制必须与约束解释系统更紧密地结合。,5.6Memento(备忘录)-对象行为型模式,动机 Memento(备忘录)模式 备忘录对象:它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的

34、原发器(Originator)。例中的ConstraintSolver就是一个原发器。 取消操作的序列描述 1. The editor requests a memento from the ConstraintSolver as aside-effect of the move operation. 2. The ConstraintSolver creates and returns a memento, an instance of a class SolverState in this case. A SolverState memento contains data structur

35、es that describe the current state of the ConstraintSolvers internal equations and variables. 3. Later when the user undoes the move operation, the editor gives the SolverState back to the ConstraintSolver. 4. Based on the information in the SolverState, the ConstraintSolver changes its internal str

36、uctures to return its equations and variables to their exact previous state.,5.6Memento(备忘录)-对象行为型模式,适用性 必须保存一个对象在某一时刻的状态,这样以后需要它时才能恢复到先前状态。 如果用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。,5.6Memento(备忘录)-对象行为型模式,结构,Memento(备忘录) 存储原发器对象的内部状态。 防止原发器以外的对象访问备忘录 管理者(Caretaker)只能看到备忘录的窄接口-只能将备忘录传递给其它对象。 原发器能看到

37、一个宽接口,允许它访问返回到先前状态所需的所有数据。 Originator(原发器) 创建一个备忘录,用以记录当前时刻它的内部状态。 使用备忘录恢复内部状态。 Caretaker(管理者) 负责保存好备忘录。 不能对备忘录的内容进行操作或检查。,5.6Memento(备忘录)-对象行为型模式,协作 管理器向原发器请求一个备忘录,保留一段时间后,将其发回给原发器。 备忘录是被动的。只有创建它的原发器会对它的状态进行赋值和检索。,5.6Memento(备忘录)-对象行为型模式,效果 1 保持封装边界 使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息。 2 它简化了原发器 管

38、理工作交给了管理者 3 使用备忘录可能代价很高 如果原发器在生成备忘录时必须拷贝并存储大量信息,或者客户非常频繁地创建备忘录和恢复原发器状态。,5.6Memento(备忘录)-对象行为型模式,效果 4 定义窄接口和宽接口 5 维护备忘录的潜在代价,5.6Memento(备忘录)-对象行为型模式,实现 1 语言支持 C+中,可将Originator作为Memento的友元类,使Memento的宽接口为私有的。只有窄接口被声明为公共的。 2 存储增量式改变 如果备忘录的创建和返回顺序是可预测的,备忘录可以仅存储原发器内部状态的增量改变。,5.6Memento(备忘录)-对象行为型模式,代码示例 P

39、191193,5.7 Observer(观察者)-对象行为型模式,意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。 别名 发布-订阅,5.7 Observer(观察者)-对象行为型模式,动机 把系统分成一些相互关联的类或者对象,如何维护这些类的实例一致性? The key objects in this pattern are subject and observer One-to-many relationship A subject may have any number of dependent observers. All o

40、bservers are notified whenever the subject undergoes a change in state.,5.7 Observer(观察者)-对象行为型模式,动机,5.7 Observer(观察者)-对象行为型模式,适用性: When an abstraction has two aspects, one dependent on the other. Encapsulating these aspects in separate objects lets you vary and reuse them independently. When a chan

41、ge to one object requires changing others, and you dont know how many objects need to be changed. When an object should be able to notify other objects without making assumptions about who these objects are. In other words, you dont want these objects tightly coupled.,5.7 Observer(观察者)-对象行为型模式,结构,5.

42、7 Observer(观察者)-对象行为型模式,参与者 Subject(目标) 提供注册和删除观察 者对象的接口 Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口 ConcreteSubject(具体目标) 当它的状态发生改变时,向它的各个观察者发出通知。 将有关状态存入各ConcreteObserver对象。,5.7 Observer(观察者)-对象行为型模式,参与者 ConcreteObserver(具体观察者) 维护一个指向ConcreteSubject对象的引用 存储有关状态,这些状态应与目标的状态保持一致。 实现Observer的更新接口以使自身状态

43、与目标状态一致。,5.7 Observer(观察者)-对象行为型模式,协作 一个目标对象和两个观察者之间的协作,5.7 Observer(观察者)-对象行为型模式,效果 1 目标和观察者之间的抽象耦合 目标只知道任何注册的观察者都符合Observer接口,不知道属于什么具体类,他们之间的耦合是抽象的和最小的。 2 支持广播通信 通知被自动广播给所有已注册的对象 在任何时候可以增加或删除观察者 处理还是忽略一个通知取决于观察者 3 意外更新 如果依赖准则的定义或维护不当,常常会引起错误更新,这种错误很难捕获。因为一个观察者并不知道其它观察者的存在。,5.7 Observer(观察者)-对象行为型

44、模式,实现 1 创建目标到其观察者之间的映射 当目标很多而观察者很少时,在目标中保存对观察者的引用可能开销很大 使用关联查找机制来维护目标到观察者的映射。这样,没有观察者的目标就不产生存储开销,但同时也增加了访问观察者的开销。 2 观察多个目标 必须扩展Update接口以使观察者知道是哪个目标送来的通知。,5.7 Observer(观察者)-对象行为型模式,实现 3 谁触发更新 由目标对象的状态设定操作在改变目标对象的状态后自动调用Notify。 优点是客户不需要记住要在目标对象上调用Notify;缺点是多个连续的操作会产生多次连续的更新,可能效率较低。 让客户负责在适当时候调用Notify。

45、 优点是客户可以在一系列状态改变完成后再一次性地触发更新,避免了中间不必要的更新。缺点是给客户增加了触发更新的责任,容易出错。,5.7 Observer(观察者)-对象行为型模式,实现 4 对已删除目标的悬挂引用 当一个目标被删除时,让它通知它的观察者将对该目标的引用重置。 5 在发出通知前确保目标的状态自身是一致的 P197 代码 6 避免特定于观察者的更新协议推/拉模型 推模型:可能使得观察者难以复用,因为目标对观察者的假定可能并不总是正确的。 拉模型:可能效率较差,因为观察者需在没有目标对象的帮助下确定改变内容。,5.7 Observer(观察者)-对象行为型模式,实现 7 显式地指定感

46、兴趣的改变 扩展目标的注册接口,让观察者注册为仅对特定事件感兴趣,以提高更新效率。 当一个事件发生时,目标只通知那些注册为对该事件感兴趣的观察者。 8 封装复杂的更新语义 当目标和观察者之间依赖关系复杂时,需要维护这些关系的对象更改管理器(ChangeManager) 维护映射关系 定义更新策略 P199 图,5.7 Observer(观察者)-对象行为型模式,代码示例 P199-201,5.8 State(状态)-对象行为型模式,意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 Allow an object to alter its behavior when

47、 its internal state changes.The object will appear to change its class. 别名 状态对象(Objects for states),5.8 State(状态)-对象行为型模式,动机 TCP连接类TCPConnection Established Listening Closed 当一个 TCPConnection对象收到其它对象请求时,它根据自身的当前状态作出不同的反应。,5.8 State(状态)-对象行为型模式,动机 解决方案 引入了一个称为TCPState的抽象类来表示网络的连接状态,其子类实现与特定状态相关的行为。 T

48、CPConnection类维护一个表示TCP当前连接状态的TCPState对象。 TCPConnection类将所有与状态相关的请求委托给这个状态对象。 一旦连接状态改变,TCPConnection对象就会改变它所使用的状态对象。,5.8 State(状态)-对象行为型模式,动机 解决方案,5.8 State(状态)-对象行为型模式,适用性 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 An objects behavior depends on its state, and it must change its behavior at run-time depen

49、ding on that state.,5.8 State(状态)-对象行为型模式,适用性 操作中含有大量多分支的条件语句,且这些分支依赖于对象的状态。 Operations have large, multipart conditional statements that depend on the objects state. This state is usually represented by one or more enumerated constants. Often, several operations will contain this same conditional s

50、tructure. The State pattern puts each branch of the conditional in a separate class. This lets you treat the objects state as an object in its own right that can vary independently from other objects.,5.8 State(状态)-对象行为型模式,结构 Context 定义客户感兴趣的接口 维护一个ConcreteState 子类的实例。 State 定义一个接口以封装与Context的一个特定状态

51、相关的行为。 ConcreteState 每个子类实现一种与Context的一个状态相关的行为。,5.8 State(状态)-对象行为型模式,协作 Context delegates state-specific requests to the State objects the Context may pass itself to the State object if the State needs to access it in order to accomplish the request State transitions are managed either by Context

52、or by State Clients interact exclusively with Context,but they might configure contexts with states e.g initial state,5.8 State(状态)-对象行为型模式,效果 1 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。 The State pattern puts all behavior associated with a particular state into one object. Because all state-specific code liv

53、es in a State subclass, new states and transitions can be added easily by defining new subclasses.,5.8 State(状态)-对象行为型模式,效果 2 它使得状态转换显式化。 It makes state transitions more explicit State is represented by the object pointed to. It protects the object from state-related inconsistencies. All implication

54、s of state changed wrapped in the atomic change of 1 pointer. 3 State对象可被共享 if no data members they can be re-used across all instances of the Context,5.8 State(状态)-对象行为型模式,实现 1 谁定义状态转换 Context 如果该转换准则固定 State 由State子类自身指定其后继状态以及何时转换,通常更灵活。 需要Context增加一个接口,让State对象显式地设定Context的当前状态。,5.8 State(状态)-对象

55、行为型模式,实现 2 基于表的另一种方法 将条件代码映射为一个查找表。 表的好处是它的规律性。 缺点: 对表的查找不如函数调用效率高。 转换规则变得不够明确而难以理解。 通常难以加入伴随状态转换的一些动作。,5.8 State(状态)-对象行为型模式,实现 3 创建和销毁State对象 需要时创建 当将要进入的状态在运行时不可知时,Context不经常改变状态时 State对象存储大量信息时 提前创建并始终不销毁 状态改变频繁时,5.8 State(状态)-对象行为型模式,代码示例 P204-207,5.9 Strategy(策略)-对象行为型模式,意图 定义一系列算法,把它们一个个封装起来,

56、并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 Define a family of algorithms, encapsulate each one, and make them interchangeable Let the algorithm vary independently from clients that use it,5.9 Strategy(策略)-对象行为型模式,动机 有些算法对于某些类是必不可少的,但是不适合于硬编进类中。客户可能需要算法的多种不同实现,允许增加新的算法实现或者改变现有的算法实现 我们可以把这样的算法封装到单独的类中,称为strateg

57、y,5.9 Strategy(策略)-对象行为型模式,动机 假设一个Composition类负责维护和更新正文浏览程序中的换行。换行策略是由抽象的Compositor类的子类各自独立实现。,5.9 Strategy(策略)-对象行为型模式,适用性 Many related classes differ only in their behavior configure a class with a particular behavior You need different variants of an algorithm An algorithm uses data that clients

58、shouldnt know about avoid exposing complex, algorithm-specific data structures,5.9 Strategy(策略)-对象行为型模式,结构 Strategy 定义算法接口 ConcreteStrategy 实现某具体算法 Context 用一个ConcreteStrategy对象来配置 维护一个对Strategy对象的引用 可定义一个接口来让Strategy访问它的数据,5.9 Strategy(策略)-对象行为型模式,协作 Strategy和Context相互作用以实现选定的算法。 Context传递数据或它自身 Co

59、ntext将它的客户请求转发给它的Strategy。,5.9 Strategy(策略)-对象行为型模式,效果 1 相关算法系列 2 一个替代继承的方法 3 消除了一些条件语句 many conditional statements invitation to apply Strategy! 4 实现的选择 usually provide different implementations of the same behavior choice decided by time vs. space trade-offs,5.9 Strategy(策略)-对象行为型模式,效果 5 客户必须了解不同的Strategy clients must understand the different strategies SortedList studentRecords = new SortedList(new ShellSort(); 6 Strategy和Context之间的通信开销 some ConcreteStrategies dont need information passed from Context 7 增加了对象数目 each Context

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论