命令模式属于对象的行为模式,它把一个请求或者操作封装在一个对象中,以便使用 不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销操作。
命令模式涉及到五个角色:
(1)client:这个客户负责创建一个ConcreteCommand,并设置其接受者。
(2)Invoker:这个调用者持有一个命令对象,并在某个时间点调用命令对象的execute方法,将请求付诸实行。
(3)Receiver:接受者知道如何进行必要的工作,实现这个请求。任何类都可以当接受者。
(4)Command:所有命令的一个接口。调用命令对象的execute方法,就可以让接受者进行相关的动作。这个接口也具备一个undo方法。
(5)ConcreteCommand:定义了动作和接受者之间的绑定关系。调用者只要调用execute方法就可以 发出请求,然后由ConcreteCommand调用接受者的一个或者多个动作。
以餐厅点餐为例
涉及到的对象
1.顾客
2.服务员
3.厨师
4.订单
步骤;
1.顾客创建订单
2.服务员将订单交给厨师
3.厨师将餐点做好给服务员(扩展:厨师有一个订单列表,当订单分为处理中和未处理,如果未处理,则顾客可以取消订单)
4.服务员餐点给到顾客
5.顾客根据订单结账
Client
package com.hm.restaurant;
//Client
public class Client extends Character{
public static void main(String[] args) {
//创建接受者
Chef chef = new Chef();
//创建命令对象:创建订单
Command order = new Order(chef);
//Invoker:服务员
Waiter waiter = new Waiter();
//takeOrder
waiter.setCommand(order);
//orderUp()
waiter.execute();
}
}
Waiter:Invoker
package com.hm.restaurant;
//Invoker
public class Waiter extends Character{
Command command;
//takeOrder();
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
Chef:Receiver
package com.hm.restaurant;
//Receiver
public class Chef extends Character {
public void cook() {
}
}
Order:ConcreteCommand
package com.hm.restaurant;
public class Order implements Command{
//接受者
Chef chef;
public Order(Chef chef) {
this.chef = chef;
}
@Override
public void execute() {
chef.cook();
}
@Override
public void undo() {
}
}
Command
package com.hm.restaurant;
public interface Command {
public void execute();
public void undo();
}