设计模式:命令模式

 

页数/内容

收获

191-206命令模式,例子:遥控器,设置不同按键不同命令

时间:8.25-8.50

命令模式:把“发出请求的对象”和“接受与执行这些请求的对象”分隔开。利用命令对象,把请求(如开灯)封装成一个特定对象(客厅电灯对象)。如果每个按钮都存储一个命令对象,那么当按钮被按下的时候,就可以请命令对象做相关的工作。遥控器并不需要知道工作内容是什么,只要有个命令对象能和正确的对象沟通,把事情做好就可以,这样就把遥控器和电灯对象解耦了。

206-214命令模式

时间:10.22-10.44

命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

一个命令对象通过在特定接收者上绑定一组动作来封装一个请求,命令对象将动作和接收者包进对象中。这个对象只暴露出一个execute()方法,当此方法调用的时候,接收者就会进行这些动作。

 

命令对象(调用)-->接收者、接收者执行的动作(封装),如遥控器开灯,灯、开灯封装起来,遥控器对象调用封装起来的接收者(灯),就可以执行开灯操作,而遥控器不需要知道如何实现。

实体类:遥控器(初始化命令,提供命令细节的方法)、灯(包含开灯动作的方法excute,构造器指定该灯的名称)

215-223命令模式

时间:11.-11.20

了解丰富遥控器的功能,Undo直接撤销的操作(如灯的开关),undo根据状态撤销(如风扇的转速)的代码

203-216命令模式,例子:遥控器的代码

时间:1.40-2.30

      2.40-3.

需求:遥控器命令(excute)电灯对象(command)打开(on)电灯

代码一:

  1. 定义接口Command,内含方法excute,用于遥控器RemoteControl操作
  2. 定义电灯对象Light,定义其包含的开on、关off方法
  3. 电灯操作对象LightOnCommand封装Light电灯,实现接口Command,定义实例变量Light,Light指定如何实现excute方法(Light.on/off)。构造函数传入Light,明确LightCommand指定哪个Light开关电灯
  4. 定义遥控器RemoteControl,定义实例变量Command,定义其包含的setCommand设置命令方法,参数为Command,明确哪一个Command将进行操作。Command.excute()明确RemoteControl调用哪个LightOnCommand进行何种操作

 

需求:遥控器命令(excute)多个电灯对象(command)打开(on)关闭(off)电灯

代码二:

1、定义NoCommand,实现Command,但其excute方法里面没有任何操作,主要用于遥控器初始化

2、重新定义遥控器NewRemoteControl

①定义实例变量数组Command[],将其初始化为NoCommand

②定义其包含的setCommand设置命令方法,参数为位置,开灯操作,关灯操作LightOffCommand

③定义对应按键位置的开灯操作的方法,参数为位置,开灯操作

④定义对应按键位置的关灯操作的方法,参数为位置,关灯操作

215-223命令模式,例子:遥控器的代码

时间:3.25-3.50

需求一:电灯的undo撤销操作

代码一(在上面代码二的基础上):

  1. 修改Command接口,添加undo方法
  2. 修改LightCommand类,添加undo方法,其内容与excute的相反,如excute开灯-->undo关灯。因为都是对指令进行添加,所以是在Command相关类操作
  3. 修改NewRemoteControl遥控器类

①添加新的实例变量undoCommand,初始化为NoCommand,用来保存上一个指令

②在开灯方法中赋值undoCommand = onCommand[slot],在关灯方法中赋值undoCommand = offCommand[slot]

③添加undo方法,调用对应的Command指令,完成撤销操作undoCommand .undo()

 

需求二:使用状态实现撤销操作

例子:风扇的转速高中低

  1. 在风扇Command中添加临时变量
  2. 执行excute方法的时候临时变量保存此时风扇的速度
  3. 在undo方法中判断该临时变量的值属于哪一个转速,然后调用那个转速方法

224-233命令模式

时间:4.10-4.20

需求:使用宏命令对电灯、风扇进行一键开关操作

  1. 用一个新的类MacroCommand实现Command

①封装需要一键操作的功能Command作为一个数组,赋值给MacroCommand的实例变量数组Command[] commands

②在excute方法中遍历该commands[i].excute

2、一键undo操作,在赋值commands的时候赋值给undoCommands,在undo方法中遍历该undoCommands[i].undo

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值