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