命令模式:
通过订单实现服务员与厨师的完全解耦
服务员不关心订单的具体内容是什么,只需要将订单交给厨师即可
角色划分
订单: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(); } }
相关推荐
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...
Java设计模式中的命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以在不同的时间、不同的地方对请求进行参数化、队列化、记录请求日志、支持撤销操作等。这种模式的主要目的是将调用者与实现者解耦,...
命令模式是设计模式中的一种,它的主要目的是将请求封装为一个对象,从而可以使用不同的请求、队列请求、或者支持撤销操作。在iOS开发中,命令模式被广泛应用,特别是在处理事件、动画序列和UI交互时。 命令模式的...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本专题中,我们将深入探讨命令模式,并通过Python和C++两种...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Head First 设计模式这本书中,第六章详细介绍了如何在C++中...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式广泛应用在各种场景中,以提高代码的灵活...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本文中,我们将深入探讨命令模式的原理、结构和实际应用,并...
在压缩包`commandPro`中,可能包含了一系列关于命令设计模式的实例代码,你可以通过查看这些代码更深入地理解命令模式的实现和应用。这些代码可能包括不同类型的命令,例如批处理命令、可撤销命令等,以及如何在实际...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在iOS开发中,命令模式尤其适用于处理事件驱动的编程场景,因为...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于降低系统之间的耦合度,提高灵活性...
如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...
设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): ...策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中实现命令模式,我们可以按照以下步骤进行: 1. **定义...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,命令模式的应用广泛且实用。 命令模式的核心是将...
Activiti 命令拦截器和设计模式 Activiti 命令拦截器和设计模式是 Activiti 工作流引擎中的一种关键机制,用于处理命令的执行和拦截。Activiti 命令拦截器使用命令模式和责任链模式来实现命令的执行和拦截。 命令...