Command Pattern

来源:互联网 发布:网络培训的好处 编辑:程序博客网 时间:2024/05/20 09:26

命令模式(Command Pattern)

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

原则

封装调用

类图

Command Pattern

Command Pattern-Light

Code

电灯控制

public interface Command {    public void execute();}// 这是一个命令,所以需要实现Command接口public class LightOnCommand implements Command {    Light light;    // 构造器被传入了某个电灯(比方说:客厅的电灯),然后记录在实例变量中。    // 一旦调用execute(),就由这个电灯对象成为接收者,负责接收请求。    public LightOnCommand(Light light){        this.light = light;    }    // 这个execute()方法调用接收对象(我们正在控制的电灯)的on()方法    @Override    public void execute() {        light.on();    }}// 控制装置public class SimpleRemoteControl {    // 有一个插槽持有命令,而这个命令控制着一个装置    Command slot;    public SimpleRemoteControl(){}    // 这个方法用来设置插槽控制的命令。如果这段代码的客户想要改变遥控器按钮的行为,    // 可以多次调用这个方法。    public void setCommand(Command command){        slot = command;    }    // 当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute()方法    public void buttonWasPressed(){        slot.execute();    }}// 测试// 控制器就是调用者,会传入一个命令对象,可以用来发出请求SimpleRemoteControl remote = new SimpleRemoteControl();// 现在创建了一个电灯对象,此对象也就是请求的接收者Light light = new Light();// 在这里创建一个命令,然后将接收者传给它LightOnCommand lightOn = new LightOnCommand(light);// 把命令传给调用者remote.setCommand(lightOn);// 模拟按下按钮remote.buttonWasPressed();

实现有7个插槽的遥控器

public class RemoteControl {    // 这个时候,遥控器要处理7个开与关的命令,使用相应数组记录这些命令    Command[] onCommands;    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;        }    }    // setCommand()方法有3个参数,分别是插槽的位置、开的命令和关的命令。    // 这些命令将记录在开关数组中对应的插槽位置,以供稍后使用    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 interface Command {    public void execute();    public void undo();}//深入电灯的命令,并实现undo()方法。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();    }}// 遥控器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;        }        // 一开始并没有所谓的“前一个命令”,所以将它设置成NoCommand        undoCommand = noCommand;    }    public void setCommand(int slot, Command onCommand, Command offCommand) {        onCommands[slot] = onCommand;        offCommands[slot] = offCommand;    }    // 当按下按钮,我们取得这个命令,并优先执行它,然后将它记录在undoCommand中。    public void onButtonWasPushed(int slot){        onCommands[slot].execute();        undoCommand = onCommands[slot];    }    public void offButtonWasPushed(int slot){        offCommands[slot].execute();        undoCommand = offCommands[slot];    }    // 当按下撤销按钮,我们调用undoCommand实例变量的undo()方法,就可以倒转前一个命令    public void undoButtonWasPushed(){        undoCommand.undo();    }}

Reference

http://cashow.github.io/head-first-design-patterns-notes-command-pattern.html

0 0
原创粉丝点击