Head First---命令模式

命令模式屬於對象的行爲模式,它把一個請求或者操作封裝在一個對象中,以便使用 不同的請求、隊列或者日誌來參數化其他對象。命令模式也支持可撤銷操作。

命令模式涉及到五個角色:

(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();

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章