[Head First设计模式笔记]----命令模式
命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
类图:
适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指定到一个不同的家电装置),每个插槽都有对应的开关按钮。这个遥控器还具备一个整体的撤销按钮。另外,多家厂商已经开发了一组Java类,例如电灯、风扇、热水器、音响设备和其他类似的可控制装置。遥控器如下图所示:
实现Code:
(1) 如下设备相关的Java类由厂商提供:
//CeilingFan.java
package RemoteControl.device; public class CeilingFan {
String name;
public CeilingFan(String str)
{
name = str;
} public void on()
{
System.out.println(name + "CeilingFan On");
} public void off()
{
System.out.println(name + "CeilingFan Off");
}
}
//GarageDoor.java
package RemoteControl.device; public class GarageDoor {
String name;
public GarageDoor(String str)
{
name = str;
} public void up()
{
System.out.println(name + "GarageDoor On");
} public void down()
{
System.out.println(name + "GarageDoor Off");
}
}
//Light.java
package RemoteControl.device; public class Light {
String name;
public Light(String str)
{
name = str;
} public void on()
{
System.out.println(name + "Light On");
} public void off()
{
System.out.println(name + "Light Off");
}
}
//Stereo.java
package RemoteControl.device; public class Stereo {
String name;
public Stereo(String str)
{
name = str;
} public void on()
{
System.out.println(name + "Stereo On");
} public void off()
{
System.out.println(name + "Stereo Off");
} public void setCD()
{
System.out.println(name + "Stereo setCD");
} public void setVolume(int num)
{
System.out.println(name + "Stereo setVolume:" + num);
}
}
(2) 将厂商提供的设备Java类库(即receiver)封装到Command类里面:
//CeilingFanOffCommand.java
package RemoteControl.Command; import RemoteControl.device.CeilingFan; public class CeilingFanOffCommand implements Command{
CeilingFan cf; public CeilingFanOffCommand(CeilingFan cf)
{
this.cf = cf;
} @Override
public void execute()
{
cf.off();
} @Override
public void undo() {
cf.on();
} }
//CeilingFanOnCommand.java
package RemoteControl.Command; import RemoteControl.device.CeilingFan; public class CeilingFanOnCommand implements Command{
CeilingFan cf; public CeilingFanOnCommand(CeilingFan cf)
{
this.cf = cf;
} @Override
public void execute()
{
cf.on();
} @Override
public void undo() {
cf.off();
}
}
//Command.java
package RemoteControl.Command; public interface Command {
public void execute();
public void undo();
}
//GarageDoorDownCommand.java
package RemoteControl.Command; import RemoteControl.device.GarageDoor; public class GarageDoorDownCommand implements Command {
GarageDoor gd; public GarageDoorDownCommand(GarageDoor gd)
{
this.gd = gd;
} @Override
public void execute()
{
gd.down();
} @Override
public void undo() {
gd.up();
}
}
//GarageDoorUpCommand.java
package RemoteControl.Command; import RemoteControl.device.GarageDoor; public class GarageDoorUpCommand implements Command {
GarageDoor gd; public GarageDoorUpCommand(GarageDoor gd)
{
this.gd = gd;
} @Override
public void execute()
{
gd.up();
} @Override
public void undo() {
gd.down();
}
}
//LightOffCommand.java
package RemoteControl.Command; import RemoteControl.device.Light; public class LightOffCommand implements Command {
Light light; public LightOffCommand(Light light)
{
this.light = light;
} @Override
public void execute()
{
light.off();
} @Override
public void undo() {
light.on();
}
}
//LightOnCommand.java
package RemoteControl.Command; import RemoteControl.device.Light; 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();
}
}
//NoCommand.java
package RemoteControl.Command; public class NoCommand implements Command{
public void execute()
{} public void undo()
{}
}
//StereoOffCommand.java
package RemoteControl.Command; import RemoteControl.device.Stereo; public class StereoOffCommand implements Command {
Stereo stereo; public StereoOffCommand(Stereo stereo)
{
this.stereo = stereo;
} public void execute()
{
stereo.off();
} @Override
public void undo() {
stereo.on();
}
}
//StereoOnWithCDCommand.java
package RemoteControl.Command; import RemoteControl.device.Stereo; public class StereoOnWithCDCommand implements Command {
Stereo stereo; public StereoOnWithCDCommand(Stereo stereo)
{
this.stereo = stereo;
} public void execute()
{
stereo.on();
stereo.setCD();
stereo.setVolume(11);
} @Override
public void undo() {
stereo.off();
}
}
(3) 实现Invoker类:
//RemoteControl.java
package RemoteControl; import RemoteControl.Command.Command;
import RemoteControl.Command.NoCommand; 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;
}
undoCommand = noCommand;
} public void setCommand(int slot, Command onCommand, Command offCommand)
{
onCommands[slot] = onCommand;
offCommands[slot] = offCommand;
} public void onButtonWasPushed(int slot)
{
onCommands[slot].execute();
undoCommand = onCommands[slot];
} public void offButtonWasPushed(int slot)
{
offCommands[slot].execute();
undoCommand = offCommands[slot];
} public void undoButtonWasPushed()
{
undoCommand.undo();
} public String toString()
{
StringBuffer stringBuff = new StringBuffer();
stringBuff.append("\n-------- Remote Control --------\n");
for(int i = 0; i < onCommands.length; i++)
{
stringBuff.append("[slot " + i + "] " + onCommands[i].getClass().getName()
+ " " + offCommands[i].getClass().getName() + "\n");
}
return stringBuff.toString();
} }
//RemoteControlTest.java
package RemoteControl; import RemoteControl.Command.CeilingFanOffCommand;
import RemoteControl.Command.CeilingFanOnCommand;
import RemoteControl.Command.GarageDoorDownCommand;
import RemoteControl.Command.GarageDoorUpCommand;
import RemoteControl.Command.LightOffCommand;
import RemoteControl.Command.LightOnCommand;
import RemoteControl.Command.StereoOffCommand;
import RemoteControl.Command.StereoOnWithCDCommand;
import RemoteControl.device.CeilingFan;
import RemoteControl.device.GarageDoor;
import RemoteControl.device.Light;
import RemoteControl.device.Stereo; public class RemoteControlTest {
public static void main(String[] args)
{
RemoteControl remoteControl = new RemoteControl(); Light livingRoomLight = new Light("Living Room");
Light kitchenLight = new Light("Kitchen");
CeilingFan ceilingFan = new CeilingFan("Living Room");
GarageDoor garageDoor = new GarageDoor("");
Stereo stereo = new Stereo("Living Room"); LightOnCommand lightRoomLightOn = new LightOnCommand(livingRoomLight);
LightOffCommand lightRoomLightOff = new LightOffCommand(livingRoomLight); LightOnCommand kitchenLightOn = new LightOnCommand(kitchenLight);
LightOffCommand kitchenLightOff = new LightOffCommand(kitchenLight); CeilingFanOnCommand ceilingFanOn = new CeilingFanOnCommand(ceilingFan);
CeilingFanOffCommand ceilingFanOff = new CeilingFanOffCommand(ceilingFan); GarageDoorUpCommand garageDoorUp = new GarageDoorUpCommand(garageDoor);
GarageDoorDownCommand garageDoorDown = new GarageDoorDownCommand(garageDoor); StereoOnWithCDCommand stereoOnWithCD = new StereoOnWithCDCommand(stereo);
StereoOffCommand stereoOff = new StereoOffCommand(stereo); remoteControl.setCommand(0, lightRoomLightOn, lightRoomLightOff);
remoteControl.setCommand(1, kitchenLightOn, kitchenLightOff);
remoteControl.setCommand(2, ceilingFanOn, ceilingFanOff);
remoteControl.setCommand(3, garageDoorUp, garageDoorDown); System.out.println(remoteControl); remoteControl.onButtonWasPushed(0);
remoteControl.offButtonWasPushed(0);
remoteControl.onButtonWasPushed(1);
remoteControl.offButtonWasPushed(1);
remoteControl.onButtonWasPushed(2);
remoteControl.offButtonWasPushed(2);
remoteControl.onButtonWasPushed(3);
remoteControl.offButtonWasPushed(3);
remoteControl.undoButtonWasPushed();
}
}
实现类图:
[Head First设计模式笔记]----命令模式的更多相关文章
- 设计模式 笔记 命令模式 Command
//---------------------------15/04/25---------------------------- //Conmmand 命令模式----对象行为型模式 /* 1:意 ...
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- 用Java 8 Lambda表达式实现设计模式:命令模式
在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- 再起航,我的学习笔记之JavaScript设计模式21(命令模式)
命令模式 概念描述 命令模式(Command): 将请求与实现解耦并封装成独立的对象,从而使不同的请求对客户端的实现参数化 示例代码 命令模式我们可以看成是将创建模块的逻辑封装在一个对象里,这个对象提 ...
- 《Head First 设计模式》学习笔记——命令模式
在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...
随机推荐
- Maven实战一
转载:http://www.iteye.com/topic/1123221 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: Cmd代码 mvn archetype:ge ...
- 【HDOJ】2369 Broken Keyboard
字符串. #include <cstdio> #include <cstring> ]; ]; int main() { int n, len; int i, j, k, tm ...
- ZOJ-2112-Dynamic Rankings(线段树套splay树)
题意: 完成两个操作: 1.询问一个区间里第k小的数: 2.修改数列中一个数的值. 分析: 线段树套平衡树,线段树中的每个节点都有一棵平衡树,维护线段树所记录的这个区间的元素.这样处理空间上是O(nl ...
- MFC添加自定义消息
由于MFC中无法通过类向导来自定义消息,所以需要手动添加,主要过程如下: 本文基于vs2008下通过线程实现数据实时更新的对话框运用程序 1. 定义消息(Resource.h文件中): 由于很多新控件 ...
- 字符串(KMP):BZOJ 3670 [Noi2014]动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1521 Solved: 813[Submit][Status] ...
- delphi NativeXml的中文支持 乱码
一般XML的编码格式设置成UTF8比较通用,下面演示使用UTF8编码方式存储和处理包含中文的XML字符串(文件).1.设置启用内置的widestring支持 NativeXml内部使用ANSI str ...
- bzoj 2330 [SCOI2011]糖果(差分约束系统)
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3574 Solved: 1077[Submit][Status ...
- UVALive 7148 LRIP 14年上海区域赛K题 树分治
题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及 ...
- cannot be deleted directly via the port API: has device owner network:floatingip
- Android应用开发学习之画廊视图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 画廊视图Gallery能按水平方向显示一组图片,并可以拖动图片.下面我们来看一个使用画廊视图的例子,其运行效果如下: ...