设计模式——11职责链模式与命令模式.pptx
职责链模式与职责链模式与命令模式命令模式Sunny Liu weiliu_内内 容容y行为模式行为模式 y职责链模式职责链模式y命令模式命令模式行为模式行为模式 y行为模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。行为模式不仅仅是关于类和对象的,而且是关于它们之间的相互作用的。y行为模式分为类的行为模式和对象的行为模式两种:0类的行为模式:类的行为模式使用继承关系在几个类之间分配行为。0对象的行为模式:对象的行为模式则使用对象的聚合来分配行为。行为模式(续)行为模式(续) y行为模式: 0职责链模式(Chain of Responsibility) 0命令模式(Command) 0迭代器模式(Iterator) 0中介者模式(Mediator) 0备忘录模式(Memento) 0观察者模式(Observer) 0状态模式(State) 0策略模式(Strategy) 0模板方法模式(Template Method) 0访问者模式(Visitor) 职责链模式职责链模式 y模式动机模式动机y在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。职责链模式(续)职责链模式(续) y模式定义模式定义y职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象的行为模式。职责链模式(续)职责链模式(续) y模式结构模式结构successorHandler+ handleRequest ()ClientConcreteHandlerA+ handleRequest ()ConcreteHandleB+ handleRequest ()职责链模式(续)职责链模式(续) y参与者参与者0Handler:抽象传递者0ConcreteHandler:具体传递者0Client:客户类职责链模式(续)职责链模式(续) y模式解释模式解释y一个定义处理请求(handleRequest)的接口,如果有多个请求,比如帮助请求、打印请求或格式化请求,我们怎么解决呢?职责链模式(续)职责链模式(续) y实例分析实例分析y实例:下达作战命令 successorOfficer#namesuccessor: String: Officer+Officer (String name)setSuccessor (Officer successor)handleRequest (): void: voidMisson-codeenemyNumber: String: int+setCode (String code)getCode ()setEnemyNumber (int enemyNumber)getEnemyNumber ()Misson (String code, int enemyNumber): void: getCode: void: intBanzhang+Banzhang (String name)handleRequest (): voidPaizhang+Banzhang (String name)handleRequest (): voidYingzhang+Banzhang (String name)handleRequest (): void职责链模式(续)职责链模式(续) y实例分析实例分析y实例:下达作战命令(代码实现) 职责链模式(续)职责链模式(续) y模式优缺点模式优缺点0降低耦合度 0增强了给对象指派职责的灵活性 0不保证被接受 0扩展性差 职责链模式(续)职责链模式(续) y模式使用模式使用y在以下条件下可以使用职责链模式:0有多个对象可以处理同一个请求,哪个对象处理该请求由运行时刻自动确定。0在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。0可动态指定一组对象处理请求。职责链模式(续)职责链模式(续) y模式应用模式应用0Java中的异常处理类似一种职责链模式 0Java事件模型(JDK 1.0或更早) 0纸牌游戏 0职责链模式可以应用于图形用户界面中 职责链模式(续)职责链模式(续) y模式深入模式深入y纯的与不纯的职责链模式y一个纯的职责链模式要求一个具体的处理者对象只能在两个行为中选择一个:一个是承担责任,二是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。纯的职责链模式的例子是不容易找到的,一般看到的例子均是不纯的职责链模式的实现。练练 习习y职责链模式中有哪些参与者,简述其职责。 y用职责链写一个专家系统,它一个接一个的尝试不同的解决方法,直到找到某个解决问题的方法为止。要求专家系统可以动态的添加解决方法。测试方法用字符串匹配,但是当匹配以后专家系统必须返回适当类型的ProblemSolver对象。考虑下,这里还会用到什么其它的模式? 命令模式命令模式 y模式动机模式动机y在软件开发过程中,有时我们需要向某些对象发送请求,但是不知道 “被请求的操作” 或 “请求的接受者”的任何信息。在面向过程的程序设计语言中,这类通信是通过回调函数来完成的:在某个地方登记这个函数,然后在后面调用它。在面向对象程序中,command(命令)与回调函数等价,它封装了回调函数。y命令模式可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。(“发送者”是请求操作的对象,“接收者”是接收请求并执行某操作的对象。有了“解耦”,发送者对接收者的接口一无所知。)在这里,“请求”(request)这个术语指的是要被执行的命令。命令模式还让我们可以对“何时”以及“如何”完成请求进行改变。因此,命令模式为我们提供了灵活性和可扩展性。命令模式(续)命令模式(续) y模式定义模式定义y命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)、事务(Transaction)。命令模式(续)命令模式(续) y模式结构模式结构receiver.action();receiverClientInvokerReceiver+ action ()Command+ execute ()ConcreteCommand- state : + execute ()命令模式(续)命令模式(续) y参与者参与者0Command:抽象命令类0ConcreteCommand:具体命令类0Client:客户应用程序0Invoker:调用者0Receiver:接收者命令模式(续)命令模式(续) y模式解释模式解释new Command(aReceiver)storeCommand(aCommand)execute()action()aReceiveraClientaCommandanInvokernew Command(aReceiver)storeCommand(aCommand)execute()action()命令模式(续)命令模式(续) y实例分析实例分析y实例一:电视机遥控器 openMyControl-onCommandoffCommandchangeCommand: Command: Command: Command+MyControl (Command on, Command off, Command change)open ()setChannel ()close (): void: void: voidOnCommand- myTV : TV+OnCommand (TV myTV)execute (): voidCommand+ execute () : voidOffCommand- myTV : TV+OffCommand (TV myTV)execute (): voidChannelCommand-myTVchannel: TV: int+ChannelCommand (TV myTV, int channel)execute (): voidTV- currentChannel : int = 0+open ()setChannel (int channel)close (): void: void: void命令模式(续)命令模式(续) y实例分析实例分析y实例一:电视机遥控器(代码实现) 命令模式(续)命令模式(续) y实例分析实例分析y实例二:简单计算器 User-calculatorcommandscurrent: Calculator: ArrayList: int = 0+redo (int levels)undo (int levels)compute (char operator, int operand): void: void: voidCalculator- total : int = 0+ operation () : voidCommandabstract +execute ()unExecute (): void: voidCalculatorCommand-operatoroperandcalculator: char: int: Calculator+CalculatorCommand (Calculator calculator, char operator, int operand)execute ()unExecute ()undo (char operator): void: void: char命令模式(续)命令模式(续) y实例分析实例分析y实例二:简单计算器 (代码实现) 命令模式(续)命令模式(续) y模式优缺点模式优缺点y命令允许请求的一方和接收请求的一方能够独立演化,从而有以下的优点:0命令模式使新的命令很容易地被加入到系统里。 0允许接收请求的一方决定是否要否决请求。 0能较容易地设计一个命令队列。 0可以容易地实现对请求的Undo和Redo。 0在需要的情况下,可以较容易地将命令记入日志。 0命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。 0命令类与其它任何别的类一样,可以修改和推广。 0可以把命令对象聚合在一起,合成为合成命令。比如宏命令便是合成命令的例子。合成命令是组合模式的应用。 0由于加进新的具体命令类不影响其它的类,因此增加新的具体命令类很容易。命令模式(续)命令模式(续) y模式优缺点模式优缺点y命令模式的主要缺点如下:0使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。命令模式(续)命令模式(续) y模式使用模式使用y在下面的情况下应当考虑使用命令模式:0使用命令模式作为“CallBack”在面向对象系统中的替代。 0需要在不同的时间指定请求、将请求排队。 0系统需要支持命令的撤消(undo)。 0如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。 0一个系统需要支持交易(Transaction)。 命令模式(续)命令模式(续) y模式应用模式应用0Java语言使用了命令模式实现java.awt中的事件委派处理模型 0许多软件的宏命令功能是命令模式的实际应用 练练 习习y命令模式中有哪些参与者,简述其职责。 y房间中的开关就是命令模式的一个实现,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,并绘制相应的类图。