[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 设计模式》学习笔记——命令模式
在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...
随机推荐
- Spark应用程序的运行框架
几个基本概念: (1)job:包含多个task组成的并行计算,往往由action催生. (2)stage:job的调度单位. (3)task:被送到某个executor上的工作单元. (4)taskS ...
- poj 1265 Area(pick定理)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4373 Accepted: 1983 Description Bein ...
- 【模拟】Codeforces 710B Optimal Point on a Line
题目链接: http://codeforces.com/problemset/problem/710/B 题目大意: 给N个点的坐标,在X轴上找到最靠左的点使得这个点到N个点距离之和最小. 题目思路: ...
- i++和++i的老问题
对于++j,该式是指先将j的值自加1,然后再取j的值.自增过后参与计算 i的值也为10:对于i++,该表达式是指先取i的值做运算,再将i加1.参见过计算后再自增
- 工资表的生成、显示、修改工资,应用transactionscope 分布式事务
一: 二:SalarySheetDAL.cs using System; using System.Collections.Generic; using System.Linq; using Syst ...
- C# dll玩注入!.net运行时库内置!?
Contents Introduction Back To Fundamentals Load The CLR Fundamentals Advanced DLL Injection Fundamen ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- 《algorithm puzzles》——概述
这个专题我们开始对<algorithm puzzles>一书的学习,这本书是一本谜题集,包括一些数学与计算机起源性的古典命题和一些比较新颖的谜题,序章的几句话非常好,在这里做简单的摘录. ...
- [置顶] android 图片库的封装
大家在做安卓应用的时候 经常要从网络中获取图片 都是通过URL去获取 可是如果本地有图片数据 从本地获取数据不更加快一些 自己在工作中遇到这个问题 所以采用了一个URL和本地图片的一个映射关系 ...
- Spring事务配置的五种方式 巨全!不看后悔,一看必懂!
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...