[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 设计模式》学习笔记——命令模式
在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...
随机推荐
- Struts2接收checkbox的值
Struts2接收checkbox的值: HTML: <input type="checkbox" name="ssl" value="B1 ...
- NodeJS制作爬虫全过程
这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的 ...
- 构造函数语义学之Copy Constructor构建操作(1)
一.Copy Constructor的构建操作 就像 default constructor 一样,如果class没有申明一个 copy constructor,就会隐含的声明或隐含的定义一个.生成的 ...
- 「Poetize7」电话线路
描述 每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示.电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”.而a.b之间建立通 ...
- id有空格获取不到元素
- 【模拟】NCPC 2014 E ceremony
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1791 题目大意: N栋大楼(N<=100000),拆除的时候有两种选择的操作,可 ...
- 【模拟】Codeforces 711B Chris and Magic Square
题目链接: http://codeforces.com/problemset/problem/711/B 题目大意: N*N的矩阵,有且只有一个0,求要把这个矩阵变成幻方要填什么正数.无解输出-1.幻 ...
- Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
1. 找到listener.ora监听文件,具体位置:D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora 2 ...
- 《Mathematical Olympiad——组合数学》——染色问题
恢复 继续关于<Mathematical Olympiad——组合数学>中问题的分析,这一篇文章将介绍有关染色的问题. 问题一: 将一些石头放入10行14列的矩形方格表内,允许在每个单元 ...
- 《JavaScript语言精髓与编程实践》读书笔记二
第3章非函数式语言特性 这一章首先介绍了语言的分类,命令式(结构化编程,面向对象编程),说明式(函数式等).而这一章,主要介绍JS的非函数式特点. 在开始之前,首先介绍了由“结构化编程”向“面向对象编 ...