`

【设计模式】命令模式

 
阅读更多

命令模式:

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

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

角色划分

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

 

  • 大小: 23.8 KB
分享到:
评论

相关推荐

    设计模式之命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...

    72-Java设计模式 命令模式1

    Java设计模式中的命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以在不同的时间、不同的地方对请求进行参数化、队列化、记录请求日志、支持撤销操作等。这种模式的主要目的是将调用者与实现者解耦,...

    iOS 设计模式 命令模式

    命令模式是设计模式中的一种,它的主要目的是将请求封装为一个对象,从而可以使用不同的请求、队列请求、或者支持撤销操作。在iOS开发中,命令模式被广泛应用,特别是在处理事件、动画序列和UI交互时。 命令模式的...

    设计模式专题之(十四)命令模式---设计模式命令模式示例代码(python--c++)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本专题中,我们将深入探讨命令模式,并通过Python和C++两种...

    Head First 设计模式 (六) 命令模式(Command pattern) C++实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Head First 设计模式这本书中,第六章详细介绍了如何在C++中...

    设计模式-命令模式(讲解及其实现代码)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...

    设计模式之命令模式源码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式广泛应用在各种场景中,以提高代码的灵活...

    设计模式之命令模式案例代码

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本文中,我们将深入探讨命令模式的原理、结构和实际应用,并...

    命令设计模式示例

    在压缩包`commandPro`中,可能包含了一系列关于命令设计模式的实例代码,你可以通过查看这些代码更深入地理解命令模式的实现和应用。这些代码可能包括不同类型的命令,例如批处理命令、可撤销命令等,以及如何在实际...

    设计模式-命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在iOS开发中,命令模式尤其适用于处理事件驱动的编程场景,因为...

    设计模式之命令模式详解(内附有例子,无源码)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于降低系统之间的耦合度,提高灵活性...

    24种设计模式以及混合设计模式

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): ...策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式之命令模式(Command)

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

    设计模式之命令模式Java实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中实现命令模式,我们可以按照以下步骤进行: 1. **定义...

    设计模式--命令模式java例子

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,命令模式的应用广泛且实用。 命令模式的核心是将...

    Activiti命令拦截器和设计模式.docx

    Activiti 命令拦截器和设计模式 Activiti 命令拦截器和设计模式是 Activiti 工作流引擎中的一种关键机制,用于处理命令的执行和拦截。Activiti 命令拦截器使用命令模式和责任链模式来实现命令的执行和拦截。 命令...

Global site tag (gtag.js) - Google Analytics