餐厅工作的场景:
1.你是顾客,把订单交给女招待。
2.女招待拿了订单,放在订单柜台,然后喊了一声“订单来了!”。
3.快餐厨师根据订单准备餐点。
命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
命令模式也支持可撤销的操作。
命令模式的更多用途
1.队列请求
命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样。
现在,即使在命令对象被创建许久之后,运算依然可以被调用。
事实上,它甚至恶意在不同的线程中被调用。
我们可以利用这样的特性衍生一些应用,例如:日程安排、线程池、工作队列等。
2.日志请求
代码示例:
实现命令接口:
public interface Command {
public void execute();
}
实现一个打开电灯的命令
package party;
public class LightOnCommand implements Command{
Light light;
@Override
public void execute() {
light.on();
}
public LightOnCommand(Light light){
this.light = light;
}
}
使用命令对象
package party;
public class SimpleRemoteConrol {
Command slot;
public SimpleRemoteConrol(){
}
public void setCommand(Command command){
slot = command;
}
public void buttonWasPressed(){
slot.execute();
}
}
遥控器使用的简单测试:
package party;
public class RemoteControlTest {
public static void main(String[] args) {
SimpleRemoteConrol remote = new SimpleRemoteConrol();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
灯对象
package party;
public class Light {
public void on(){
System.out.println("light is on");
}
public void off(){
System.out.println("light is off");
}
}