命令模式屬於對象的行爲模式,它把一個請求或者操作封裝在一個對象中,以便使用 不同的請求、隊列或者日誌來參數化其他對象。命令模式也支持可撤銷操作。
命令模式涉及到五個角色:
(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();
}