命令模式:
通過訂單實現服務員與廚師的完全解耦
服務員不關心訂單的具體內容是什么,只需要將訂單交給廚師即可
角色劃分
訂單 :Command
服務員 :Invoker
廚師 :Receiver
?
使用命令模式可以實現工作隊列,將接收到的命令放到BlockingQueue中
任務執行者從BlockingQueue中獲取任務即可
?
?
package pattern.command;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
//Command
public interface Order {
Order add(String item);
void execute();
}
//ConcreteCommand
/**
* 訂單內部封裝:1.點餐項目 2.廚師
* 命令對象的作用:實現服務員Invoker與廚師Receiver之間完全解耦
*/
class CookOrder implements Order {
List<String> items = new ArrayList<String>();
public Order add(String item) {
items.add(item);
return this;
}
//內部維護一個工作隊列
ArrayBlockingQueue<List<String>> blokingQueue = new ArrayBlockingQueue<List<String>>(100);
//Receiver
Chief chief;
public CookOrder(Chief chief) {
this.chief = chief;
}
public void execute() {
blokingQueue.add(items);
chief.cook(this);
}
}
?
package pattern.command;
//Invoker
/**
* 服務員并不關心訂單上的具體內容是什么
* 只負責接收訂單命令,并調用orderUp()-即execute()
*
* 服務員與廚師之間通過"訂單對象"實現了解耦!
*/
public class Waitress {
//Command
Order order;
public void setRoder(Order order) {
this.order = order;
}
public void serve() {
order.execute();
}
}
?
package pattern.command;
import java.util.List;
/**
* 真正執行任務的對象
*/
public class Chief {
//廚師接收到具體訂單內容,開始cook
public void cook(CookOrder cookOrder) {
try {
List<String> items = cookOrder.blokingQueue.take();
System.out.println("Chief cooking: " + items);
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
?
package pattern.command;
public class Client {
public static void main(String[] args) {
// Receiver
Chief chief = new Chief();
// Command:命令對象封裝【命令的接收者】和【具體的任務】
Order order1 = new CookOrder(chief);
order1.add("coffee").add("bread");
giveOrderToWaitress(order1);
// Command:命令對象封裝【命令的接收者】和【具體的任務】
Order order2 = new CookOrder(chief);
order2.add("tea").add("bread");
giveOrderToWaitress(order2);
}
private static void giveOrderToWaitress(Order order) {
// Invoker:負責將命令對象傳遞給執行者
Waitress waitress = new Waitress();
// setCommand
waitress.setRoder(order);
waitress.serve();
}
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

