命令模式

使请求的调用者和实现者解耦 请求通过命令来传递
命令被封装成对象

烤肉之摊贩

摊贩

烤羊肉串
烤羊肉串
烤鸡翅
public class BarbecuerTest {public void testBoothBarbecue(){Barbecuer barbecuer = new Barbecuer();barbecuer.makeMutton();barbecuer.makeMutton();barbecuer.makeChickenWing();}}
public class Barbecuer {public void makeMutton(){ConsoleUtil.println("烤羊肉串");}public void makeChickenWing(){ConsoleUtil.println("烤鸡翅");}
}

店铺

烤鸡翅
烤羊肉串

@Test
public class CommandShopTest {public void testShop(){Barbecuer barbecuer = new Barbecuer();ChickenWingCommand chickenWingCommand = new ChickenWingCommand(barbecuer);MuttonCommand muttonCommand = new MuttonCommand(barbecuer);MuttonCommand muttonCommand1 = new MuttonCommand(barbecuer);Waiter waiter = new Waiter();waiter.addCommand(chickenWingCommand);waiter.addCommand(muttonCommand);waiter.addCommand(muttonCommand1);waiter.removeCommand(muttonCommand1);waiter.execute();}
}public class Barbecuer {public void makeMutton(){ConsoleUtil.println("烤羊肉串");}public void makeChickenWing(){ConsoleUtil.println("烤鸡翅");}
}public abstract class Command {protected Barbecuer barbecuer;public Command(Barbecuer barbecuer) {this.barbecuer = barbecuer;}public abstract void execute();
}public class ChickenWingCommand extends Command {public ChickenWingCommand(Barbecuer barbecuer) {super(barbecuer);}@Overridepublic void execute() {barbecuer.makeChickenWing();}
}public class MuttonCommand extends Command {public MuttonCommand(Barbecuer barbecuer) {super(barbecuer);}@Overridepublic void execute() {barbecuer.makeMutton();}
}public class Waiter {private LinkedHashSet<Command> commands = new LinkedHashSet<>();public void addCommand(Command command){commands.add(command);}public void removeCommand(Command command){commands.remove(command);}public void execute(){for (Command command : commands) {command.execute();}}
}

店铺升级

欢迎光临欢迎光临19号桌加餐如下
4样食物,金额1692.0元,已付0.0元,
鸡翅3个 36.0元
飞天茅台1个 1500.0元
鱿鱼8个 96.0元
羊肉串20个 60.0元18号桌加餐如下
4样食物,金额1677.0元,已付0.0元,
飞天茅台1个 1500.0元
鱿鱼6个 72.0元
羊腰子3个 15.0元
羊肉串30个 90.0元18号桌共总1677.0元 支付1000.0元 已支付1000.0 还需677.0元制作3个鸡翅耗时4秒
制作1瓶飞天茅台耗时2秒
制作8条鱿鱼耗时4秒
制作20个羊肉串耗时2秒19号桌点的菜以做好 点菜清单如下
19号桌结账走人
4样食物,金额1692.0元,已付0.0元,还剩1692.0元
鸡翅3个 36.0元
飞天茅台1个 1500.0元
鱿鱼8个 96.0元
羊肉串20个 60.0元
谢谢惠顾4样食物,金额1692.0元,已付0.0元,
鸡翅3个 36.0元
18号桌共总1677.0元 支付1000.0元 已支付2000.0 多支付323.0元18号桌结账走人
飞天茅台1个 1500.0元
鱿鱼8个 96.0元
4样食物,金额1677.0元,已付2000.0元,待找323.0元
飞天茅台1个 1500.0元
鱿鱼6个 72.0元
羊肉串20个 60.0元
客户已走 我自己吃...羊腰子3个 15.0元
羊肉串30个 90.0元
谢谢惠顾制作1瓶飞天茅台耗时2秒
制作6条鱿鱼耗时1秒
制作3个羊腰子耗时4秒
制作30个羊肉串耗时2秒18号桌点的菜以做好 点菜清单如下
4样食物,金额1677.0元,已付2000.0元,
飞天茅台1个 1500.0元
鱿鱼6个 72.0元
羊腰子3个 15.0元
羊肉串30个 90.0元
客户已走 我自己吃...
@Test
public class BarbecuerTest {public static void main(String[] args) {//不能用junit 在threadPool中sleep醒不来new BarbecuerTest().testShopBarbecue();}private void testShopBarbecue(){Shop shop = new Shop();shop.open();new Thread(()->eat18(shop,"18号桌")).start();new Thread(()->eat19(shop,"19号桌")).start();ThreadUtil.sleep(10000);shop.close();}private void eat19(Shop shop, String table) {Waiter waiter = shop.eat();Order order = new Order(table);order.addFood(FoodList.MOUTAI,1).addFood(FoodList.MUTTON,20).addFood(FoodList.CHICKEN_WING,3).addFood(FoodList.SQUID,8);waiter.addOrder(order);ThreadUtil.sleep(8000);waiter.bye(table);}private void eat18(Shop shop, String table) {Waiter waiter = shop.eat();Order order = new Order(table);order.addFood(FoodList.MOUTAI,1).addFood(FoodList.MUTTON,30).addFood(FoodList.SHEEP_KIDNEY,3).addFood(FoodList.SQUID,6);waiter.addOrder(order);waiter.payAmount(table,1000);ThreadUtil.sleep(10);waiter.payAmount(table,1000);waiter.bye(table);}
}
public class Shop {private Waiter waiter = new Waiter();private Kitchen kitchen = new Kitchen();public void open(){waiter.startWork();kitchen.startWork();}public Waiter eat(){synchronized (IntelligentBrain.getInstance()){ConsoleUtil.println("欢迎光临");ConsoleUtil.printLongLine(" ");}return waiter;}public void close() {waiter.stopWork();kitchen.stopWork();}
}public class Waiter {private IntelligentBrain intelligentBrain = IntelligentBrain.getInstance();void stopWork() {}void startWork(){intelligentBrain.setFoodPrepareSuccessListener(order -> {ConsoleUtil.println("%s点的菜以做好 点菜清单如下",order.getTableName());order.printFoods(false);if(order.isOver()){ConsoleUtil.println("客户已走 我自己吃...");}else {ConsoleUtil.println("现在马不停蹄的送过去...");}ConsoleUtil.printLongLine(" ");});}public void addOrder(Order order){intelligentBrain.addOrder(order);}public double getPayAmount(String table){return intelligentBrain.getPayAmount(table);}public void payAmount(String table,double payAmount){intelligentBrain.payAmount(table,payAmount);}public void bye(String table){intelligentBrain.bye(table);}
}public class Kitchen {private ThreadPoolExecutor barbecuers = new ThreadPoolExecutor(1,3, 1000000, TimeUnit.SECONDS, new LinkedBlockingQueue<>());private IntelligentBrain intelligentBrain = IntelligentBrain.getInstance();void stopWork() {barbecuers.shutdown();}void startWork(){intelligentBrain.setFoodPrepareListener((taskId, order) -> work(taskId,order));}private void work(String taskId, Order order) {if(!barbecuers.isShutdown()){barbecuers.execute(() -> {order.make();intelligentBrain.notifyFoodPrepareSuccess(taskId);});}else {synchronized (IntelligentBrain.getInstance()){ConsoleUtil.println("已下班 %s的菜不做了",order.getTableName());ConsoleUtil.printLongLine(" ");}}}
}public class Order {private String tableName;private Map<Food, FoodItem> items = new HashMap<>();private double payedAmount;private static FoodPriceList foodPriceList = new FoodPriceList();private boolean over;public Order(String tableName) {this.tableName = tableName;}void over(){this.over = true;}boolean isOver() {return over;}void addPayedAmount(double payedAmount){this.payedAmount += payedAmount;}double getPayAmount(){return getOrderAmount() - payedAmount;}double getPayedAmount() {return payedAmount;}public void Order(String tableName){this.tableName = tableName;}String getTableName() {return tableName;}double getOrderAmount() {double amount = 0;for (FoodItem item : items.values()) {amount += getFoodPrice(item.getFood()) * item.getQuantity();}return amount;}public Order addFood(Food food,int quantity) {if(!foodPriceList.hasFood(food)){ConsoleUtil.println("%s添加的%不存在",tableName,food);return this;}FoodItem foodItem = items.get(food);if(foodItem == null){foodItem = new FoodItem(food,0);items.put(food,foodItem);}foodItem.setQuantity(foodItem.getQuantity()+quantity);return this;}void mergeOrder(Order order) {payedAmount += order.getPayAmount();Map<Food, FoodItem> items = order.items;for (FoodItem foodItem : items.values()) {addFood(foodItem.getFood(),foodItem.getQuantity());}}void printFoods(boolean pay) {String suffix = "";if(pay){double payAmount = getPayAmount();if(payAmount > 0){suffix += "还剩"+payAmount+"元";}else {suffix += "待找"+Math.abs(payAmount)+"元";}}ConsoleUtil.println("%s样食物,金额%s元,已付%s元,%s",items.size(),getOrderAmount(),payedAmount,suffix);for (FoodItem item : items.values()) {ConsoleUtil.println("%s%s个 %s元",item.getFood().getName(),item.getQuantity(),getFoodPrice(item.getFood()) * item.getQuantity());}}private double getFoodPrice(Food food) {return foodPriceList.getPrice(food);}void make() {synchronized (IntelligentBrain.getInstance()){items.values().forEach(item->{int quantity = item.getQuantity();item.getFood().execute(quantity);});ConsoleUtil.printLongLine(" ");}}
}public class FoodPriceList {private Map<Food,Double> foodPrices = new HashMap<>();{foodPrices.put(FoodList.MOUTAI,1500d);foodPrices.put(FoodList.CHICKEN_WING,12d);foodPrices.put(FoodList.MUTTON,3d);foodPrices.put(FoodList.SHEEP_KIDNEY,5d);foodPrices.put(FoodList.SQUID,12d);}public double getPrice(Food food){return foodPrices.get(food);}public boolean hasFood(Food food) {return foodPrices.containsKey(food);}
}public class Cook {static final Cook cook = new Cook();public void makeMoutai(Object args){int millis = ThreadUtil.sleep(1000, 5000)/1000;ConsoleUtil.println("制作%s瓶飞天茅台耗时%s秒",args,millis);}public void makeChickenWing(Object args){int millis = ThreadUtil.sleep(1000, 5000)/1000;ConsoleUtil.println("制作%s个鸡翅耗时%s秒",args,millis);}public void makeMutton(Object args){int millis = ThreadUtil.sleep(1000, 5000)/1000;ConsoleUtil.println("制作%s个羊肉串耗时%s秒",args,millis);}public void makeSquid(Object args){int millis = ThreadUtil.sleep(1000, 5000)/1000;ConsoleUtil.println("制作%s条鱿鱼耗时%s秒",args,millis);}public void makeSheepKidney(Object args){int millis = ThreadUtil.sleep(1000, 5000)/1000;ConsoleUtil.println("制作%s个羊腰子耗时%s秒",args,millis);}
}public interface Command {void execute(Object args);
}public abstract class Food implements Command{protected Cook cook;public Food(Cook cook) {this.cook = cook;}public abstract String getName();
}public interface FoodList {Food MOUTAI = new MoutaiFood(Cook.cook);ChickenWingFood CHICKEN_WING = new ChickenWingFood(Cook.cook);MuttonFood MUTTON = new MuttonFood(Cook.cook);SheepKidneyFood SHEEP_KIDNEY = new SheepKidneyFood(Cook.cook);SquidFood SQUID = new SquidFood(Cook.cook);class MoutaiFood extends Food{public MoutaiFood(Cook cook) {super(cook);}@Overridepublic String getName() {return "飞天茅台";}@Overridepublic void execute(Object args) {cook.makeMoutai(args);}}class ChickenWingFood extends Food{public ChickenWingFood(Cook cook) {super(cook);}@Overridepublic String getName() {return "鸡翅";}@Overridepublic void execute(Object args) {cook.makeChickenWing(args);}}class MuttonFood extends Food{public MuttonFood(Cook cook) {super(cook);}@Overridepublic String getName() {return "羊肉串";}@Overridepublic void execute(Object args) {cook.makeMutton(args);}}class SheepKidneyFood extends Food{public SheepKidneyFood(Cook cook) {super(cook);}@Overridepublic String getName() {return "羊腰子";}@Overridepublic void execute(Object args) {cook.makeSheepKidney(args);}}class SquidFood extends Food{public SquidFood(Cook cook) {super(cook);}@Overridepublic String getName() {return "鱿鱼";}@Overridepublic void execute(Object args) {cook.makeSquid(args);}}}public class FoodItem {private Food food;private int quantity;public FoodItem(Food food, int quantity) {this.food = food;this.quantity = quantity;}public Food getFood() {return food;}public int getQuantity() {return quantity;}public void setQuantity(int quantity) {this.quantity = quantity;}
}public interface FoodPrepareListener {void onFoodPrepare(String taskId,Order order);
}public interface FoodPrepareSuccessListener {void onFoodPrepareSuccess(Order order);
}public class IntelligentBrain {private FoodPrepareSuccessListener foodPrepareSuccessListener;private FoodPrepareListener foodPrepareListener;private static IntelligentBrain INSTANCE = new IntelligentBrain();private Map<String,Order> orders = new ConcurrentHashMap<>();private Map<String,Order> prepareOrders = new ConcurrentHashMap<>();public void bye(String table) {synchronized (IntelligentBrain.getInstance()){ConsoleUtil.println("%s结账走人",table);Order order = orders.remove(table);order.over();order.printFoods(true);ConsoleUtil.println("谢谢惠顾");ConsoleUtil.printLongLine(" ");}}public double getPayAmount(String table) {Order order = orders.get(table);return order.getPayAmount();}public void payAmount(String table,double payAmount){Order order = orders.get(table);order.addPayedAmount(payAmount);double needPayAmount = order.getPayAmount();String needPayAmountStr = needPayAmount < 0 ? "多支付" : "还需";needPayAmountStr += Math.abs(needPayAmount)+"元";synchronized (IntelligentBrain.getInstance()){ConsoleUtil.println("%s共总%s元 支付%s元 已支付%s %s",table,order.getOrderAmount(),payAmount,order.getPayedAmount(),needPayAmountStr);ConsoleUtil.printLongLine(" ");}}public static IntelligentBrain getInstance() {return INSTANCE;}public void setFoodPrepareListener(FoodPrepareListener foodPrepareListener) {this.foodPrepareListener = foodPrepareListener;}public void setFoodPrepareSuccessListener(FoodPrepareSuccessListener listener){foodPrepareSuccessListener = listener;}public void notifyFoodPrepareSuccess(String taskId){Order order = prepareOrders.remove(taskId);foodPrepareSuccessListener.onFoodPrepareSuccess(order);}public void addOrder(Order order){checkFoodListener();if(orders.containsKey(order.getTableName())){order.mergeOrder(order);}else {orders.put(order.getTableName(),order);}synchronized(IntelligentBrain.getInstance()){String action = orders.containsKey(order.getTableName()) ? "加餐" : "点餐";ConsoleUtil.println("%s%s如下",order.getTableName(),action);order.printFoods(false);ConsoleUtil.printLongLine(" ");}String taskId = UUID.randomUUID().toString();ThreadUtil.sleep(100);prepareOrders.put(taskId,order);foodPrepareListener.onFoodPrepare(taskId,order);}private void checkFoodListener() {if(foodPrepareSuccessListener == null){ConsoleUtil.println("请设置foodPrepareSuccessListener");}if(foodPrepareListener == null){ConsoleUtil.println("请设置foodPrepareListener");}}
}

大话设计模式 第二十三章 命令模式 考羊肉串相关推荐

  1. 大话设计模式之爱你一万年:第二十三章 行为模式:解释器模式:在也不用担心工资计算错误了:3.解释器模式之简单计算器3.0

    上面的在上面的这个代码中,我们目前并没有看出解释器模式的优势,感觉代码反而变复杂了呐,引入了好几个类. 我们发现在的计算器只能解释a+b这种类型的表达式,如果表达式是a+b+c- 的呢,上面的代码就无 ...

  2. 大话设计模式之爱你一万年:第二十三章 行为模式:解释器模式:在也不用担心工资计算错误了:1.解释器模式

    打印社在女朋友的管理下,运转的还不错.但最近就有点不太平了- 女朋友说这个有财务是不是会把这个工资计算错了,难道是咱们的薪资结构太复杂了.很烦人- 这个长期下去确实不是办法,这个验收的人也会很揪心.要 ...

  3. 第二十三章 Caché 命令大全 SET 命令

    文章目录 第二十三章 Caché 命令大全 SET 命令 重点 大纲 参数 描述 将多个变量设置为相同的值 设置多个变量的限制 参数 pc variable value JSON值 JSON对象 JS ...

  4. 系统集成项目管理工程师(软考中级)—— 第二十三章 风险管理 笔记分享

    前言 现在分享一些笔记给大家,希望能够帮助大家并顺利通过软考. 幕布地址:第二十三章 风险管理 - 幕布 概述 大数据 ITO 4W1H 风险 概念 风险是一种不确定的事件或条件,一旦发生,就会产生积 ...

  5. 【正点原子Linux连载】第二十三章 音频应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    第二十三章 音频应用编程 ALPHA I.MX6U开发板支持音频,板上搭载了音频编解码芯片WM8960,支持播放以及录音功能! 本章我们来学习Linux下的音频应用编程,音频应用编程相比于前面几个章节 ...

  6. 【正点原子STM32连载】第二十三章 OLED显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  7. 第二十三章 MySQL数据库 手册2 SQL语句

    第二十三章 MySQL数据库 手册2 SQL语句 实验二:用SQL语句,管理数据库 `危险命令,delete 后不加 where 条件代表删除所有数据 delete.` `更加危险的删除命令trunc ...

  8. 第 17 章 命令模式

    第 17 章 命令模式 1.智能生活项目需求 我们买了一套智能家电, 有照明灯. 风扇. 冰箱. 洗衣机, 我们只要在手机上安装 app 就可以控制对这些家电工作. 这些智能家电来自不同的厂家, 我们 ...

  9. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. 安卓开发必备知识体系:安卓篇
  2. webView.loadUrl(file:///android_asset/table3.html)出现中文乱码的问题
  3. Visual Studio 安装失败
  4. 2.5 结构化程序设计的方法
  5. send anywhere:一个全平台的文件传输神器
  6. 【大数据部落】R语言犯罪率回归模型报告Regression model on crimerate report
  7. python切片详解_python切片及sys.argv[]用法详解
  8. 开发uni-app时HBuilderX编辑器使用微信小程序模拟器保存代码无法刷新模拟器问题
  9. 如何让excel在两个窗口分开显示
  10. 简单的动漫网页成品 HTML+CSS静态网页作业 DW动漫网页设计与制作素材成品代做 海贼王主题网页设计制作6个页面
  11. linux中ll排序命令,ll命令
  12. js数组方法的返回值总结
  13. meta pseudo label
  14. JPA Native Query(本地查询)及查询结果转换
  15. SAP中会计凭证清账关系
  16. 去掉word 2007中可恶的信息检索
  17. 北京大学可视化发展前沿研究生暑期学校Day3
  18. 计算机专业云平台管理试题,练习题云平台/计算机软考考试试题-考试系统
  19. php开发微信公众账号开发包开发教程五之请求响应处理
  20. [Java初学]Java上溯造型(upcasting)与下溯造型(Downcasting)

热门文章

  1. SQL求用户的最大连续登陆天数
  2. opencv python 多张jpg图片转成avi视频
  3. 96微信编辑器如何将样式中的二维码替换成自己的?
  4. BINKS 502375润滑脂
  5. 美式期权定价python_蒙特卡洛模拟和美式期权定价
  6. java 图片操作技术之RGB的获取
  7. 台式计算机键盘进水了还能用,台式电脑键盘进水了怎么办
  8. 天翼云服务器硬盘怎么挂载,天翼云主机云磁盘管理(一)
  9. http 协议大文件下载
  10. foxit 福昕阅读器 点击书签跳转时,保持 页面 缩放比例