命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

类图:

适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指定到一个不同的家电装置),每个插槽都有对应的开关按钮。这个遥控器还具备一个整体的撤销按钮。另外,多家厂商已经开发了一组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设计模式笔记]----命令模式的更多相关文章

  1. 设计模式 笔记 命令模式 Command

    //---------------------------15/04/25---------------------------- //Conmmand  命令模式----对象行为型模式 /* 1:意 ...

  2. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  3. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  4. 面向对象设计模式_命令模式(Command)解读

    在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...

  5. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  6. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  7. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  8. 再起航,我的学习笔记之JavaScript设计模式21(命令模式)

    命令模式 概念描述 命令模式(Command): 将请求与实现解耦并封装成独立的对象,从而使不同的请求对客户端的实现参数化 示例代码 命令模式我们可以看成是将创建模块的逻辑封装在一个对象里,这个对象提 ...

  9. 《Head First 设计模式》学习笔记——命令模式

    在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...

随机推荐

  1. Struts2 cookie的存取

    /** * Cookieの追加 * @return * @throws Exception */ private void addCookie(String name,String value){ C ...

  2. 【转】Android低功耗蓝牙应用开发获取的服务UUID

    原文网址:http://blog.csdn.net/zhangjs0322/article/details/39048939 Android低功耗蓝牙应用程序开始时获取到的蓝牙血压计所有服务的UUID ...

  3. Xcode7真机调试iOS应用程序

    金田 近日苹果发布的新的Xcode7带来了许多特性,比如:swift语言比以前运行更快.功能更强.代码具有更高的可读性.Xcode的测试功能可以帮助用户记录应用程序的行为等,还有我们今天要讲到的Xco ...

  4. AC自动机(Aho-Corasick automation)模板 HDU:2222

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> us ...

  5. QTP自传之测试报告

    前言 测试报告是测试阶段的最后产出,也是最重要的产出,自动化测试报告也是如此.前期所做的工作,添加对象.编写脚本等都是为了可以生成一份正确.严谨的测试报告.我作为一款功能全面的自动化测试工具,毫无疑问 ...

  6. Invert Binary Tree——LeetCode

    Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia:This problem was ...

  7. 【转】AngularJs $location获取url参数

    // 带#号的url,看?号的url,见下面 url = http://qiaole.sinaapp.com?#name=cccccc $location.absUrl(); // http://qi ...

  8. 解决Win8不能上网攻略第二版!三步秒杀原驱动

    关于Win8消费者预览版的网卡驱动确实是令人头疼的事情,不少用户都抱怨无法联网而且驱动卸载十分麻烦.IT之家社区luoyousi 此前分享<图文教程:解决Win8消费者预览版不能上网问题> ...

  9. 再回首,Java温故知新(八):Java基础之字符串

    字符串是Java中使用频率最高的类,但是它却不属于基本类型,而是预定义了String类来表示.从String类的源码可以看到,String是基于char[]实现的,而且Java中的String是不可变 ...

  10. UIDevice 系统信息详解

    获取当前设备    //获取当前设备    UIDevice *dev = [UIDevice currentDevice]; 设备和系统基本信息    NSLog(@"设备名称:%@&qu ...