【设计模式】命令模式

系统 1697 0

命令模式:

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

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

角色划分

订单 :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元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论