23 设计模式教学课件_第1页
23 设计模式教学课件_第2页
23 设计模式教学课件_第3页
23 设计模式教学课件_第4页
23 设计模式教学课件_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

命令 Command 模式 烤羊肉串引来的思考 紧耦合松耦合 另一场景 电脑装配好了 如何开机 首先加载电源 然后是设备检查 再然后是装载系统 最后电脑就正常启动了 可是谁来完成这些过程 如何完成 真正完成这些工作的是主板 那么客户和主板如何发生联系呢 现实中 是用连接线把按钮连接到主板上的 这样当客户按下按钮的时候 就相当于发命令给主板 让主板去完成后续的工作 从客户的角度来看 开机就是按下按钮 不管什么样的主板都是一样的 也就是说 客户只管发出命令 谁接收命令 谁实现命令 如何实现 客户是不关心的 有何问题 客户端只是想要发出命令或者请求 不关心请求的真正接收者是谁 也不关心具体如何实现 而且同一个请求的动作可以有不同的请求内容 当然具体的处理功能也不一样 该怎么实现 命令 Command 模式 命令模式又称为行动 Action 模式或交易 Transaction 模式 命令模式把一个请求或者操作封装到一个对象中 命令模式允许系统使用不同的请求把客户端参数化 对请求排队或者记录请求日志 可以提供命令的撤销和恢复功能 命令模式是对命令的封装 命令模式把发出命令的责任和执行命令的责任分割开 委派给不同的对象 每一个命令都是一个操作 请求的一方发出请求要求执行一个操作 接收的一方收到请求 并执行操作 命令模式允许请求的一方和接收的一方独立开来 使得请求的一方不必知道接收请求的一方的接口 更不必知道请求是怎么被接收 以及操作是否被执行 何时被执行 以及是怎么被执行的 命令 Command 角色 声明了一个给所有具体命令类的抽象接口 这是一个抽象角色 具体命令 ConcreteCommand 角色 定义一个接收者和行为之间的弱耦合 实现Execute 方法 负责调用接收者的相应操作 Execute 方法通常叫做执行方法 请求者 Invoker 角色 负责调用命令对象执行请求 接收者 Receiver 角色 负责具体实施和执行一个请求 任何一个类都可以成为接收者 实施和执行请求的方法叫做行动方法 示意性代码 abstractclassCommand protectedReceiverreceiver publicCommand Receiverreceiver this receiver receiver abstractpublicvoidExecute classConcreteCommand Command publicConcreteCommand Receiverreceiver base receiver publicoverridevoidExecute receiver Action classInvoker privateCommandcommand publicvoidSetCommand Commandcommand mand command publicvoidExecuteCommand command Execute classProgram staticvoidMain string args Receiverr newReceiver Commandc newConcreteCommand r Invokeri newInvoker Setandexecutecommandi SetCommand c i ExecuteCommand Console Read 使用命令模式来实现示例 解决思路 机箱上的按钮就相当于是命令对象机箱相当于是Invoker主板相当于接收者对象命令对象持有一个接收者对象 就相当于是给机箱的按钮连上了一根连接线当机箱上的按钮被按下的时候 机箱就把这个命令通过连接线发送出去 接收者 publicinterfaceMainBoardApi publicvoidopen publicclassGigaMainBoardimplementsMainBoardApi publicvoidopen System out println 技嘉主板现在正在开机 请等候 System out println 接通电源 System out println 设备检查 System out println 装载系统 System out println 机器正常运转起来 System out println 机器已经正常打开 请操作 定义命令接口和命令的实现 publicinterfaceCommand publicvoidexecute publicclassOpenCommandimplementsCommand privateMainBoardApimainBoard null publicOpenCommand MainBoardApimainBoard this mainBoard mainBoard publicvoidexecute this mainBoard open 定义发起者 publicclassBox privateCommandopenCommand publicvoidsetOpenCommand Commandcommand this openCommand command publicvoidopenButtonPressed 按下按钮 执行命令openCommand execute 客户使用按钮 publicclassClient publicstaticvoidmain String args MainBoardApimainBoard newGigaMainBoard OpenCommandopenCommand newOpenCommand mainBoard Boxbox newBox box setOpenCommand openCommand box openButtonPressed 讨论 将请求的接收者 处理者 放到Command的具体子类ConcreteCommand中 当请求到来时 Invoker发出Invoke消息激活Command对象 ConcreteCommand将处理请求交给Receiver对象进行处理 Command模式将调用操作的对象和知道如何实现该操作的对象解耦 在上面Command的结构图中 Invoker对象根本就不知道具体的是哪个对象在处理Excute操作 在Command下要增加新的处理操作对象很容易 我们可以通过创建新的继承自Command的子类来实现这一点 Command模式可以和Memento模式结合起来 支持Undo的操作 在什么情况下应当使用命令模式 如果需要在不同的时刻指定 排列和执行请求 可以选用命令模式 把这些请求封装成为命令对象 然后实现把请求队列化如果需要支持取消操作 可以选用命令模式 通过管理命令对象 能很容易的实现命令的恢复和重做的功能 如果需要支持当系统崩溃时 能把对系统的操作功能重新执行一遍 可以选用命令模式 把这些操作功能的请求封装成命令对象 然后实现日志命令 就可以在系统恢复回来后 通过日志获取命令列表 从而重新执行一遍功能在需要事务的系统中 可以选用命令模式 命令模式提供了对事务进行建模的方法 命令模式有一个别名就是Transaction 命令模式优点 命令允许请求的一方和接收请求的一方能够独立演化 从而有以下的优点 命令模式使新的命令很容易地被加入到系统里 允许接收请求的一方决定是否要否决 Veto 请求 能较容易地设计一个命令队列 可以容易地实现对请求的Undo和Redo 在需要的情况下 可以较容易地将命令记入日志 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开 命令类与其他任何别的类一样 可以修改和推广 本质 封装请求 实例扩展 下面的代码使用命令模式演示了一个简单的计算器 并允许执行undo与redo 注意 operator 在C 中是关键词 所以在前面添加一个 将其变为标识符 Command abstractclassCommand MethodsabstractpublicvoidExecute abstractpublicvoidUnExecute classCalculatorCommand Command char operator intoperand Calculatorcalculator publicCalculatorCommand Calculatorcalculator char operator intoperand this calculator calculator this operator operator this operand operand publiccharOperator set operator value publicintOperand set operand value overridepublicvoidExecute calculator Operation operator operand overridepublicvoidUnExecute calculator Operation Undo operator operand privatecharUndo char operator charundo switch operator case undo break case undo break case undo break case undo break returnundo Receiver classCalculator privateinttotal 0 publicvoidOperation char operator intoperand switch operator case total operand break case total operand break case total operand break case total operand break Console WriteLine Total 0 following 1 2 total operator operand Invoker classUser privateCalculatorcalculator newCalculator privateArrayListcommands newArrayList privateintcurrent 0 publicvoidRedo intlevels Console WriteLine Redo 0 levels levels for inti 0 i levels i if current commands Count 1 Command commands current Execute publicvoidUndo intlevels Console WriteLine Undo 0 levels levels for inti 0 i0 Command commands current UnExecute publicvoidCompute char operator intoperand Commandcommand newCalculato

温馨提示

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

最新文档

评论

0/150

提交评论