命令模式:
通过订单实现服务员与厨师的完全解耦
服务员不关心订单的具体内容是什么,只需要将订单交给厨师即可
角色划分
订单 :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(); } }