中国石油工程建设协会网站,如何提高关键词搜索排名,市场监督管理局官网入口,展厅设计公司推荐去小餐馆吃饭的时候#xff0c;顾客直接跟厨师说想要吃什么菜#xff0c;然后厨师再开始炒菜。去大点的餐馆吃饭时#xff0c;我们是跟服务员说想吃什么菜#xff0c;然后服务员把这信息传到厨房#xff0c;厨师根据这些订单信息炒菜。为什么大餐馆不省去这个步骤#xf… 去小餐馆吃饭的时候顾客直接跟厨师说想要吃什么菜然后厨师再开始炒菜。去大点的餐馆吃饭时我们是跟服务员说想吃什么菜然后服务员把这信息传到厨房厨师根据这些订单信息炒菜。为什么大餐馆不省去这个步骤像小餐管那样点菜呢原因主要有以下几点
提供效率。厨师专注炒菜就行而不必花时间跟客户接触。各司其职提高服务质量。厨师擅长炒菜而服务员擅长跟顾客打交道。使工作有条不紊的进行。不会像小餐馆那样来了个新客户需要马上停止炒菜去招呼客人而另一边客户要在催着上菜。阻断客户与厨师的接触。客户无须知道炒菜的厨师是谁厨师也不需要知道他为谁炒的菜。
在这里服务员发挥着“命令”的作用将客户的命令传递给厨师厨师做出相应。而这种模式是一种“命令模式”。
1 命令模式概述
引入一个命令类通过命令类来降低发送者和接收者的耦合度。将一个请求封装成一个命令对象发送者只需指定一个命令对象再通过命令对象来调用请求接收者的处理方法。 图 命令模式结构图
Command抽象命令类一般是抽象类或接口。声明了用于执行请求的execute()等方法通过这些方法可调用请求接收者相关操作。
ConcreteCommand具体命令类对应具体接收者对象维护了一个接收者对象的引用在实现execute()方法时将调用接收者对象的相关操作(action()方法等)。
Invoker调用者即请求发送者。通过命令对象来执行请求。
Reciver接收者执行与请求相关的操作具体实现对请求的业务处理。
public interface Command {String getName();void makeOrder(String name);}public class WaiterCommand implements Command{private final String name;private CookReceiver cookReceiver;public WaiterCommand(String name, CookReceiver cookReceiver) {this.name name;this.cookReceiver cookReceiver;}public void setCookReceiver(CookReceiver cookReceiver) {this.cookReceiver cookReceiver;}Overridepublic String getName() {return name;}Overridepublic void makeOrder(String name) {System.out.print( cookReceiver.getName() );cookReceiver.cooking(name);}}
public class CookReceiver {private final String name;public CookReceiver(String name) {this.name name;}public String getName() {return name;}public void cooking(String name) {System.out.println(开始做菜 name);}}
public class CustomerInvoker {private Command waiter;public CustomerInvoker(Command waiter) {this.waiter waiter;}public void changeWaiter(Command waiter) {this.waiter waiter;}public void makeOrder(String name) {System.out.print(waiter.getName() 为客户下单);waiter.makeOrder(name);}}
public class Client {private final static ListCommand waiterList new ArrayList();static {CookReceiver cook1 new CookReceiver(黄师傅);CookReceiver cook2 new CookReceiver(刘师傅);waiterList.add(new WaiterCommand(小李,cook1));waiterList.add(new WaiterCommand(小张,cook2));waiterList.add(new WaiterCommand(小王, cook1));}public static void main(String[] args) {String[] menu {辣椒炒肉,剁椒鱼头,清蒸豆腐,爆炒花甲,酸辣螺蛳粉};Random random new Random();for (int i 0; i 6; i) {CustomerInvoker invoker new CustomerInvoker(waiterList.get(random.nextInt( waiterList.size())));invoker.makeOrder(menu[random.nextInt(menu.length)]);System.out.println(--------------);}
// 运行结果
// 小王为客户下单 黄师傅开始做菜酸辣螺蛳粉
// --------------
// 小王为客户下单 黄师傅开始做菜辣椒炒肉
// --------------
// 小张为客户下单 刘师傅开始做菜剁椒鱼头
// --------------
// 小张为客户下单 刘师傅开始做菜爆炒花甲
// --------------
// 小王为客户下单 黄师傅开始做菜辣椒炒肉
// --------------
// 小王为客户下单 黄师傅开始做菜酸辣螺蛳粉
// --------------}}
命令模式的本质是对请求进行封装一个请求对应一个命令。将发送命令与执行命令分割开但不能减少类的数量。
1.1 命令队列
一个请求发送者发送一个请求时不止一个请求接收者产生响应这些接收者将逐个执行业务方法完成对请求的处理。 图 命令队列结构图
2 优缺点
优点
降低系统的耦合度请求者与接收者之间完全解耦相同的请求者可对应不同的接收者。同样相同的接收者也也可以供不同的请求者使用两者具有良好的独立性。新的命令可用很容易地加入系统中。增加新的具体命令不会影响其他类符合开闭原则。笔记容易设计一个命令队列或宏命令。为请求的撤销和恢复操作提供了一种设计和实现方案。
缺点
1会导致系统有过多的具体命令类。
3 适用场景
需要将请求调用者和请求接收者解耦。系统需要支持命令的撤销和恢复操作。需要将一组操作组合在一起形成宏命令。需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求的初始调用者可以有不同的生命期。即最初的请求发出者可能已经不在了而命令对象本身仍然是活动的。可以通过该命令对象去调用请求接收者而无须关系请求调用者的存在性可以通过请求日志等机制来具体实现。