Command Pattern
来源:互联网 发布:网络培训的好处 编辑:程序博客网 时间:2024/05/20 09:26
命令模式(Command Pattern)
命令模式——将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也可支持撤销操作。
原则
封装调用
类图
Code
电灯控制
public interface Command { public void execute();}// 这是一个命令,所以需要实现Command接口public class LightOnCommand implements Command { Light light; // 构造器被传入了某个电灯(比方说:客厅的电灯),然后记录在实例变量中。 // 一旦调用execute(),就由这个电灯对象成为接收者,负责接收请求。 public LightOnCommand(Light light){ this.light = light; } // 这个execute()方法调用接收对象(我们正在控制的电灯)的on()方法 @Override public void execute() { light.on(); }}// 控制装置public class SimpleRemoteControl { // 有一个插槽持有命令,而这个命令控制着一个装置 Command slot; public SimpleRemoteControl(){} // 这个方法用来设置插槽控制的命令。如果这段代码的客户想要改变遥控器按钮的行为, // 可以多次调用这个方法。 public void setCommand(Command command){ slot = command; } // 当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute()方法 public void buttonWasPressed(){ slot.execute(); }}// 测试// 控制器就是调用者,会传入一个命令对象,可以用来发出请求SimpleRemoteControl remote = new SimpleRemoteControl();// 现在创建了一个电灯对象,此对象也就是请求的接收者Light light = new Light();// 在这里创建一个命令,然后将接收者传给它LightOnCommand lightOn = new LightOnCommand(light);// 把命令传给调用者remote.setCommand(lightOn);// 模拟按下按钮remote.buttonWasPressed();
实现有7个插槽的遥控器
public class RemoteControl { // 这个时候,遥控器要处理7个开与关的命令,使用相应数组记录这些命令 Command[] onCommands; Command[] offCommands; // 在构造器中,只需实例化并初始化这两个开与关的数组 public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for (int i = 0; i < 7; i++) { onCommands[i] = noCommand; offCommands[i] = noCommand; } } // setCommand()方法有3个参数,分别是插槽的位置、开的命令和关的命令。 // 这些命令将记录在开关数组中对应的插槽位置,以供稍后使用 public void setCommand(int slot, Command onCommand, Command offCommand) { onCommands[slot] = onCommand; offCommands[slot] = offCommand; } // 当按下开或关的按钮,硬件就会负责调用对应的方法 public void onButtonWasPushed(int slot){ onCommands[slot].execute(); } public void offButtonWasPushed(int slot){ offCommands[slot].execute(); }}public interface Command { public void execute(); public void undo();}//深入电灯的命令,并实现undo()方法。public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light){ this.light = light; } @Override public void execute() { light.on(); } @Override public void undo() { light.off(); }}// 遥控器public class RemoteControl { Command[] onCommands; Command[] offCommands; // 前一个命令将被记录在这里 Command undoCommand; public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for (int i = 0; i < 7; i++) { onCommands[i] = noCommand; offCommands[i] = noCommand; } // 一开始并没有所谓的“前一个命令”,所以将它设置成NoCommand undoCommand = noCommand; } public void setCommand(int slot, Command onCommand, Command offCommand) { onCommands[slot] = onCommand; offCommands[slot] = offCommand; } // 当按下按钮,我们取得这个命令,并优先执行它,然后将它记录在undoCommand中。 public void onButtonWasPushed(int slot){ onCommands[slot].execute(); undoCommand = onCommands[slot]; } public void offButtonWasPushed(int slot){ offCommands[slot].execute(); undoCommand = offCommands[slot]; } // 当按下撤销按钮,我们调用undoCommand实例变量的undo()方法,就可以倒转前一个命令 public void undoButtonWasPushed(){ undoCommand.undo(); }}
Reference
http://cashow.github.io/head-first-design-patterns-notes-command-pattern.html
0 0
- Command Pattern
- Command Pattern
- Command pattern
- Command Pattern
- command pattern
- command pattern
- Command Pattern
- command pattern
- Command Pattern
- Command Pattern
- Command Pattern
- Command Pattern
- Command Pattern
- Command Pattern
- The sixth pattern------------Command Pattern
- Design Pattern 12-Command
- 命令模式(Command Pattern)
- 命令模式(Command Pattern)
- Django集成DjangoUeditor的cannot import name patterns解决方法
- Glide基础
- NIO与传统IO的区别
- DispatcherServlet
- The hierarchy of the type is inconsistent
- Command Pattern
- 排序算法
- java 并发工具类-Semaphore
- spark累加器介绍-案例通过累加器统计文章中空白行数量
- 鸟哥的linux私房菜学习笔记《十一》磁盘与文件系统(block与inode)
- Android默认系统声音/大小修改及配置
- 树莓派+微雪AlphaBot小车初使用
- springboot常用注解(包含spring及MVC)
- Service(下)