[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 设计模式》学习笔记——命令模式
在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...
随机推荐
- 带你走进EJB--MDB实现发送邮件(1)
在实际的项目中我们有这样的需求,用户注册网站成功之后系统会自动的给注册用户发送注册成功通知邮件,而发送通知邮件的具体过程我们可以通过MDB来实现. 在用MDB来实现发送通知过程之前我们需要先了解一下J ...
- BAT 批处理实现循环备份N天文件夹
@echo off set today=%date:~0,4%%date:~5,2%%date:~8,2% xcopy /E /I E:\aaa e:\test\%today% for /f &qu ...
- mysql explain 解释
就是10W记录比如全表返回1行 Mysql显示可能是10W oracle是1行 mysql 是预估需要扫描的记录 Oracle 是预估返回的记录
- BZOJ1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4 ...
- POJ-3693-Maximum repetition substring(后缀数组-重复次数最多的连续重复子串)
题意: 给出一个串,求重复次数最多的连续重复子串 分析: 比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现几次. 既然长度为L的串重复出现,那么str[0],str[l],str ...
- Pen Editor
Pen Editor
- 【宽搜】Vijos P1206 CoVH之再破难关
题目链接: https://vijos.org/p/1206 题目大意: 给你开始和结束两张4x4的01图,每次操作只能够交换相邻的两个格子(有公共边),问最少的操作步数. 题目思路: [搜索] 这题 ...
- 关于DocumentCompleted事件
关于DocumentCompleted事件,MSDN给出的解释是在文档加载完毕后执行,但是在我的程序中DocumentCompleted却被多次调用,查了一下资料,大概出现了以下几种情况. 1.Web ...
- CentOS-6.4-i386硬盘安装
由于安装程序不能识别NTFS分区上的镜像,因此需要变通,网上可参考的文章分为两种方法: 1.使用分区工具创建EXT分区,再用Windows下可访问EXT分区的软件,将安装镜像拷入进行安装. 2.使用分 ...
- Postman 安装 & 资料
安装 下载地址: http://chromecj.com/web-development/2014-09/60/download.html 怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件? ...