/**
* 设计模式 - 命令模式
* 命令接口
*/
public interface Command {
public void execute();
}
实现一个打开点灯的命令
/**
* 设计模式 - 命令模式
* 打开灯命令
*/
public class LightOnCommand implements Command { // 这是一个命令,需要实现Command接口
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
使用命令对象
/**
* 设计模式 - 命令模式
* 使用命令对象
*/
public class SimpleRemoteControl {
Command slot; // 有一个插槽持有命令,而这个命令控制着一个装置
public SimpleRemoteControl() {}
public void setCommand(Command command) {
slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
简单测试
/**
* 设计模式 - 命令模式
* 测试程序
*/
public class RemoteControlTest { // 这是命令模式的客户
public static void main(String[] args) {
SimpleRemoteControl remote = new SimpleRemoteControl(); // 遥控器就是调用者,传入一个命令对象,可以用来发出请求
Light light = new Light(); // 创建一个点灯对象,此对象也就是请求的接受者
LightOnCommand lightOn = new LightOnCommand(light); // 这里创建一个命令,然后将接受者传给它
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
输出
bovenson@ThinkCentre:/home/...$ cd "/home/public/Git/notes/Design Pattern/Code/Cha6/" && javac RemoteControlTest.java && java RemoteControlTest
Light is on
实现遥控器
/**
* 设计模式 - 命令模式
* 遥控器类
*/
public class RemoteControl {
Command[] onCommands; // 遥控器处理7个开关命令
Command[] offCommands;
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;
}
}
public void setCommand(int slot, Command onCommand, Command offCommand) {
onCommands[slot] = onCommand;
offCommands[slot] = offCommand;
}
public void onButtonWasPushed(int slot) {
onCommands[slot].execute();
}
public void offButtonWasPushed(int slot) {
offCommands[slot].execute();
}
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();
}
}
再次测试遥控器
/**
* 设计模式 - 命令模式
* 测试遥控器
*/
public class RemoteLoader {
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("Home");
Stereo stereo = new Stereo("Living Room");
LightOnCommand livingRoomLightOn = new LightOnCommand(livingRoomLight);
LightOffCommand livingRoomLightOff = new LightOffCommand(livingRoomLight);
LightOnCommand kitchenLightOn = new LightOnCommand(kitchenLight);
LightOffCommand kitchenLightOff = new LightOffCommand(kitchenLight);
CeilingFanOnCommand ceilingFanOn = new CeilingFanOnCommand(ceilingFan);
CeilingFanOffCommand ceilingFanOff = new CeilingFanOffCommand(ceilingFan);
GarageDoorUpCommand garageDoorUpCommand = new GarageDoorUpCommand(garageDoor);
GarageDoorDownCommand garageDoordownCommand = new GarageDoorDownCommand(garageDoor);
StereoOnWithCDCommand stereoOnWithCDCommand = new StereoOnWithCDCommand(stereo);
StereoOffCommand stereoOffCommand = new StereoOffCommand(stereo);
remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);
remoteControl.setCommand(1, kitchenLightOn, kitchenLightOff);
remoteControl.setCommand(2, ceilingFanOn, ceilingFanOff);
remoteControl.setCommand(3, stereoOnWithCDCommand, stereoOffCommand);
remoteControl.setCommand(4, garageDoorUpCommand, garageDoordownCommand);
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.onButtonWasPushed(4);
remoteControl.offButtonWasPushed(4);
}
}
输出
bovenson@ThinkCentre:/home/public/Git/notes/Design Pattern/Code/Cha6$ cd "/home/public/Git/notes/Design Pattern/Code/Cha6/" && javac RemoteLoader.java && java RemoteLoader
------ Remote Control ------
[slot 0] LightOnCommand LightOffCommand
[slot 1] LightOnCommand LightOffCommand
[slot 2] CeilingFanOnCommand CeilingFanOffCommand
[slot 3] StereoOnWithCDCommand StereoOffCommand
[slot 4] GarageDoorUpCommand GarageDoorDownCommand
[slot 5] NoCommand NoCommand
[slot 6] NoCommand NoCommand
Living Room light is on
Living Room light is off
Kitchen light is on
Kitchen light is off
Living Room ceiling fan is on high
Living Room ceiling fan is off
Living Room stereo is on
Living Room stereo is set for CD input
Living Room Stereo volume set to 11
Living Room stereo is off
Home garage Door is Up
Home garage Door is Up