命令模式:
通過訂單實(shí)現(xiàn)服務(wù)員與廚師的完全解耦
服務(wù)員不關(guān)心訂單的具體內(nèi)容是什么,只需要將訂單交給廚師即可
角色劃分
訂單 :Command
服務(wù)員 :Invoker
廚師 :Receiver
?
使用命令模式可以實(shí)現(xiàn)工作隊(duì)列,將接收到的命令放到BlockingQueue中
任務(wù)執(zhí)行者從BlockingQueue中獲取任務(wù)即可
?
?
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 /** * 訂單內(nèi)部封裝:1.點(diǎn)餐項(xiàng)目 2.廚師 * 命令對(duì)象的作用:實(shí)現(xiàn)服務(wù)員Invoker與廚師Receiver之間完全解耦 */ class CookOrder implements Order { List<String> items = new ArrayList<String>(); public Order add(String item) { items.add(item); return this; } //內(nèi)部維護(hù)一個(gè)工作隊(duì)列 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 /** * 服務(wù)員并不關(guān)心訂單上的具體內(nèi)容是什么 * 只負(fù)責(zé)接收訂單命令,并調(diào)用orderUp()-即execute() * * 服務(wù)員與廚師之間通過"訂單對(duì)象"實(shí)現(xiàn)了解耦! */ 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; /** * 真正執(zhí)行任務(wù)的對(duì)象 */ public class Chief { //廚師接收到具體訂單內(nèi)容,開始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:命令對(duì)象封裝【命令的接收者】和【具體的任務(wù)】 Order order1 = new CookOrder(chief); order1.add("coffee").add("bread"); giveOrderToWaitress(order1); // Command:命令對(duì)象封裝【命令的接收者】和【具體的任務(wù)】 Order order2 = new CookOrder(chief); order2.add("tea").add("bread"); giveOrderToWaitress(order2); } private static void giveOrderToWaitress(Order order) { // Invoker:負(fù)責(zé)將命令對(duì)象傳遞給執(zhí)行者 Waitress waitress = new Waitress(); // setCommand waitress.setRoder(order); waitress.serve(); } }
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
