【设计模式】命令模式

命令模式:

通过订单实现服务员与厨师的完全解耦

服务员不关心订单的具体内容是什么,只需要将订单交给厨师即可

角色划分

订单: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();
	}
}

猜你喜欢

转载自just2learn.iteye.com/blog/2099902