public class Gate {
public void open() {
System.out.println("gate open,,,");
}
public void close() {
System.out.println("gate close,,,");
}
}
public class Light {
public void on() {
System.out.println("light on,,,");
}
public void off() {
System.out.println("light off,,,");
}
}
public interface Command {
void execute();
void undo();
void save();
void load();
}
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
public void undo() {
light.off();
}
public void save() {
// TODO
}
public void load() {
// TODO
}
}
public class GateOpenCommand implements Command {
private Gate gate;
public GateOpenCommand(Gate gate) {
this.gate = gate;
}
public void execute() {
gate.open();
}
public void undo() {
gate.close();
}
public void save() {
// TODO
}
public void load() {
// TODO
}
}
public class NoCommand implements Command {
//所有方法没有实现,表示命令没有具体执行内容
public void execute() {
System.out.println("no command execute,,,");
}
public void undo() {
System.out.println("no command undo,,,");
}
public void save() {}
public void load() {}
}
public class Controller {
private Command[] commands;
private Stack<Command> undoStack;
public Controller(int size) {
this.commands = new Command[size];
for (int i = 0; i < size; i++) {
commands[i] = new NoCommand();
}
undoStack = new Stack<Command>();
}
public void setCommand(int index, Command command) {
Preconditions.checkElementIndex(index, commands.length);
Preconditions.checkNotNull(command);
commands[index] = command;
}
public void undoOperation() {
if (undoStack.isEmpty()) {
System.out.println("undo stack empty");
return;
}
undoStack.pop().undo();
}
public void onButtonPress(int index) {
Preconditions.checkElementIndex(index, commands.length);
commands[index].execute();
undoStack.push(commands[index]);
}
}
public class ClientTest {
public static void main(String[] args) {
Light light = new Light();
Gate gate = new Gate();
LightOnCommand lightOnCommand = new LightOnCommand(light);
LightOffCommand lightOffCommand = new LightOffCommand(light);
GateOpenCommand gateOpenCommand = new GateOpenCommand(gate);
GateCloseCommand gateCloseCommand = new GateCloseCommand(gate);
Controller controller = new Controller(6);
controller.setCommand(0, lightOnCommand);
controller.setCommand(1, lightOffCommand);
controller.setCommand(2, gateOpenCommand);
controller.setCommand(3, gateCloseCommand);
controller.onButtonPress(0);
controller.onButtonPress(1);
controller.onButtonPress(2);
controller.onButtonPress(3);
controller.onButtonPress(4);
controller.onButtonPress(5);
System.out.println();
controller.undoOperation();
controller.undoOperation();
controller.undoOperation();
controller.undoOperation();
controller.undoOperation();
controller.undoOperation();
controller.undoOperation();
controller.undoOperation();
}
}
下面是运行结果
light on,,,
light off,,,
gate open,,,
gate close,,,
no command execute,,,
no command execute,,,
no command undo,,,
no command undo,,,
gate open,,,
gate close,,,
light on,,,
light off,,,
undo stack empty
undo stack empty
相关推荐
python-project:使用python我的所有desgn项目
运行效果https://www.bilibili.com/video/BV1KZ4y1k7NM/
use-design-to-solve-technical-bottlenecks-090419084944-phpapp01
系统设计原理项目1:C的基本实施Project2:一个简单的外壳Project3:虚拟内存模拟器Project4:内存分配器Project5:客户端/服务器编程
power Amp Desgn stk4211 by Robert
基于单片机的电子钟汇编程序,对初学者有用,好好看看
RGPV compiler desgn practical list
[Cisco][Designing.for.Cisco.Internetwork.Solutions-Foundation.Learning.Guide.(CCDA.DESGN.640-864,3rd.2011.7).文字版
vue_form_design 项目设置 npm install 编译和热重装以进行开发 npm run serve 编译并最小化生产 npm run build 整理和修复文件 npm run lint 自定义配置 请参阅。