Head First 设计模式之命令模式_第1页
Head First 设计模式之命令模式_第2页
Head First 设计模式之命令模式_第3页
Head First 设计模式之命令模式_第4页
Head First 设计模式之命令模式_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、Head First 设计模式之命令模式前言: 本章会将封装带入到一个全新的境界,把方法调用封装起来。通过封装方法调用,把运算块包装成形。调用此运算的对象不需要知道事情是如何进行的,只要知道如何使用包装形成的方法来完成它就ok了。1 现实场景应用现在有一个遥控器,该遥控器有7个插槽需要编程,可以在每个插槽上放上不同的装置,然后用按钮控制它,这七个插槽具备各自的“开”“关”按钮,还有一个整体用的撤销按钮,会撤销最后一个按钮的动作。1.1 创建第一个命令对象1.1.1 定义命令接口csharp view plain copy 在CODE上查看代码片派生到我的代码片public interfaceC

2、ommand void Execute(); 1.1.2 实现一个打开灯的命令csharp view plain copy 在CODE上查看代码片派生到我的代码片publicclass Light /电灯类 public void On() System.Console.WriteLine("Light is On !"); public void Off() System.Console.WriteLine("Light is Off !"); public class LightOnCommand : Command/实现开灯命令 private L

3、ight light; public LightOnCommand(Light light) this.light = light; public void Execute() light.On(); 1.1.3 使用命令对象csharp view plain copy 在CODE上查看代码片派生到我的代码片public class LightControl privateCommand soft; publicvoid SetCommand(Command cmd) soft= cmd;/设置命令对象 publicvoid ButtonWasPressed() soft.Execute();

4、/调用命令对象的方法 1.1.4 简单测试csharp view plain copy 在CODE上查看代码片派生到我的代码片LightControl lightControl = new LightControl();/模拟命令的调用者 Lightlight = new Light();/创建一个电灯对象,作为命令的接收者 LightOnCommand lightOnCommand = new LightOnCommand(light);/创建一个命令,并将接受者传递给它 lightControl.SetCommand(lightOnCommand);/将命令传给调用者 lightContr

5、ol.ButtonWasPressed();/模拟触发按钮 1.2 实现遥控器csharp view plain copy 在CODE上查看代码片派生到我的代码片public class RemoteControl Command onCommands;/定义打开的命令数组 Command offCommands; /定义关闭的命令数组 public RemoteControl() onCommands = new Command7; offCommands = new Command7; Command noCommand = newNoCommand(); for (int i = 0;

6、i < 7; i+) onCommandsi = noCommand;/初始化命令数组(默认设置为无命令) offCommandsi = noCommand; /将命令设置到对应的控制器 public void SetCommand(int index,Command onCommand, Command offCommand) onCommandsindex = onCommand; offCommandsindex = offCommand; /触发打开控制器 public void OnButtonWasPressed(int index) onCommandsindex.Exec

7、ute(); /触发关闭控制器 public void OffButtonWasPressed(intindex) offCommandsindex.Execute(); public override string ToString() StringBuilder str = newStringBuilder(); str.Append("n-RemoteControl -n"); for (int i = 0; i <onCommands.Length; i+) str.Append("solt" +i + "" + onC

8、ommandsi.GetType().FullName + " " +offCommandsi.GetType().FullName + "n"); return str.ToString(); 1.3 实现其他控制器csharp view plain copy 在CODE上查看代码片派生到我的代码片 /关闭电灯命令 public classLightOffCommand : Command privateLight light; publicLightOffCommand(Light light) this.light = light; publicv

9、oid Execute() light.Off(); publicvoid Undo() light.On(); /打开电扇命令 public class CeilingFanOnCommand : Command CeilingFan ceilingFan; intpreSpeed; publicCeilingFanOnCommand(CeilingFan ceilingFan) this.ceilingFan = ceilingFan; publicvoid Execute() ceilingFan.On(); publicvoid Undo() ceilingFan.Off(); /关闭

10、电扇命令 public classCeilingFanOffCommand : Command CeilingFan ceilingFan; publicCeilingFanOffCommand(CeilingFan ceilingFan) this.ceilingFan = ceilingFan; publicvoid Execute() ceilingFan.Off(); publicvoid Undo() ceilingFan.On(); /打开车库门命令 public classGarageDoorOnCommand : Command GarageDoor garageDoor; p

11、ublicGarageDoorOnCommand(GarageDoor garageDoor) this.garageDoor= garageDoor; publicvoid Execute() garageDoor.On(); publicvoid Undo() garageDoor.Off(); /关闭车库门命令 public classGarageDoorOffCommand : Command GarageDoor garageDoor; publicGarageDoorOffCommand(GarageDoor garageDoor) this.garageDoor = garage

12、Door; publicvoid Execute() garageDoor.Off(); publicvoid Undo() garageDoor.On(); /打开CD命令 public classStereCDOnCommand : Command StereCDstereCD; publicStereCDOnCommand(StereCD stereCD) this.stereCD = stereCD; publicvoid Execute() stereCD.On(); publicvoid Undo() stereCD.Off(); /关闭CD命令 public classStere

13、CDOffCommand : Command StereCDstereCD; publicStereCDOffCommand(StereCD stereCD) this.stereCD = stereCD; publicvoid Execute() stereCD.Off(); publicvoid Undo() stereCD.On(); 1.4简单测试csharp view plain copy 在CODE上查看代码片派生到我的代码片RemoteControlremoteControl = new RemoteControl (); CeilingFan ceilingFan = newC

14、eilingFan("Living Room");/创建电扇对象 GarageDoor garageDoor = newGarageDoor();/创建车库门对象 StereCD stereCD = new StereCD();/创建CD对象 Light light = new Light();/创建电灯对象 LightOnCommand lightOnCommand = newLightOnCommand(light);/创建开灯命令 LightOffCommand lightOffCommand =new LightOffCommand(light); /创建关灯命令

15、CeilingFanOnCommandceilingFanOn = new CeilingFanOnCommand(ceilingFan); /创建开电扇命令 CeilingFanOffCommand ceilingFanOff= new CeilingFanOffCommand(ceilingFan);/创建关电扇命令 GarageDoorOnCommand garageDoorOn =new GarageDoorOnCommand(garageDoor);/创建打开电扇命令 GarageDoorOffCommand garageDoorOff= new GarageDoorOffComma

16、nd(garageDoor);/创建关闭电扇命令 StereCDOnCommand stereCDOn = newStereCDOnCommand(stereCD);/创建打开CD命令 StereCDOffCommand stereCDOff = newStereCDOffCommand(stereCD);/创建关闭CD命令 remoteControl.SetCommand(0,lightOnCommand, lightOffCommand);/将电灯命令设置到对应的控制器上 Control.SetCommand(1,ceilingFanOn, ceilingFanOff); /将电灯命令设置

17、到对应的控制器上 remoteControl.SetCommand(2,garageDoorOn, garageDoorOff); /将车库门命令设置到对应的控制器上 remoteControl.SetCommand(3,stereCDOn, stereCDOff); /将CD命令设置到对应的控制器上 remoteControl.OnButtonWasPressed(0); remoteControl.OffButtonWasPressed(0); remoteControl.OnButtonWasPressed(1); remoteControl.OffButtonWasPressed(1)

18、; remoteControl.OnButtonWasPressed(2); remoteControl.OffButtonWasPressed(2); remoteControl.OnButtonWasPressed(3); remoteControl.OffButtonWasPressed(3); 1.5 实现撤销命令1.5.1 修改命令接口,新增Undo()方法csharp view plain copy 在CODE上查看代码片派生到我的代码片public interfaceCommand void Execute(); void Undo();/新增撤销方法 1.5.2 修改命令,实现

19、Undo方法csharp view plain copy 在CODE上查看代码片派生到我的代码片public class LightOnCommand : Command private Light light; public LightOnCommand(Light light) this.light = light; public void Execute() light.On(); public void Undo()/实现Undo方法 light.Off(); 其他类都依次修改1.5.3 修改RemoteControl类,新增Command对象记录上一步操作csharp view pl

20、ain copy 在CODE上查看代码片派生到我的代码片public class RemoteControlWithUndo Command onCommands; Command offCommands; CommandundoCommand;/创建Command对象用来记录上一步执行的命令 publicRemoteControlWithUndo() onCommands = new Command7; offCommands = new Command7; Command noCommand = new NoCommand(); for(int i = 0; i < 7; i+) o

21、nCommandsi = noCommand; offCommandsi = noCommand; undoCommand = noCommand; . publicvoid OnButtonWasPressed(int index) onCommandsindex.Execute(); undoCommand = onCommandsindex;/记录打开命令 publicvoid OffButtonWasPressed(int index) offCommandsindex.Execute(); undoCommand = offCommandsindex;/记录关闭命令 publicvo

22、id UndoButtonWasPressed()/执行撤销 undoCommand.Undo(); 1.6 宏命令让遥控器具有Party模式,即一个按键能够同步调用多个命令,这就是所谓的宏命令。 csharp view plain copy 在CODE上查看代码片派生到我的代码片public class MacroCommand : Command Command commands;/定义命令数组,用来接收传入的命令 public MacroCommand(Command commands) mands = commands; public void Execute()/批量处理多个命令(即初始化的时候传入的命令数组) for (int i = 0; i <commands.Length; i+) commandsi.Execute(); public void Undo() for (int i = 0; i <

温馨提示

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

评论

0/150

提交评论