itstack-demo-design命令模式:给小二的「按钮」,让做菜派单等任务统一调度、统一撤销
itstack-demo-design命令模式给小二的「按钮」让做菜派单等任务统一调度、统一撤销【免费下载链接】itstack-demo-design:art: 《重学Java设计模式》是一本互联网真实案例实践书籍。以落地解决方案为核心从实际业务中抽离出交易、营销、秒杀、中间件、源码等22个真实场景来学习设计模式的运用。欢迎关注小傅哥微信(fustack)公众号bugstack虫洞栈博客https://bugstack.cn项目地址: https://gitcode.com/fuzhengwei/itstack-demo-designitstack-demo-design 是《重学 Java 设计模式》的官方示例工程其中命令模式Command Pattern示例用餐厅里小二点单、厨师做菜的真实场景几行代码就把统一调度、统一撤销的核心思想讲透了。这篇文章面向新手不带大量代码带你 10 分钟看懂命令模式在真实业务里到底怎么用。命令模式是什么30秒搞懂用一个餐厅场景就能理解命令模式角色餐厅里的谁做的事调用者Invoker小二只负责收单、下单不关心怎么做菜命令Command菜系鲁菜、川菜…把做一道菜封装成一个对象接收者Receiver厨师真正干活的人一句话总结把要做的事封装成对象就能像点菜一样排队、批量执行、甚至撤单。先看反面教材小二里的 if-else 灾难项目里 XiaoEr.java14-01 模块是最初的写法小二每收到一个菜系编号就要加一段if判断。想上新菜改小二想改菜名还是改小二。小二成了万金油类每加一道菜都要动一次核心代码典型的违反开闭原则。命令模式版小二只干两件事重构后的 XiaoEr.java14-02 模块只有两个动作order把菜命令对象加进点单列表相当于排队placeOrder遍历列表逐个做菜做完清空列表public void order(ICuisine cuisine) { cuisineList.add(cuisine); } public synchronized void placeOrder() { for (ICuisine cuisine : cuisineList) { cuisine.cook(); } cuisineList.clear(); }小二完全不知道有粤菜还是川菜它只调用统一的cook()方法。关键代码都在 cuisine/ 目录里命令接口 ICuisine.java只有一个cook()方法所有菜系统一实现接收者接口 ICook.java厨师的doCooking()具体命令 ShanDongCuisine.java把厨师装进菜里cook()时转手交给厨师跑一下 ApiTest.java四道菜依次点单、一次性下单调度过程一目了然。命令模式的三大实战价值新增任务不改核心加一道闽菜只需新增一个类实现ICuisine小二、测试一行都不用动。统一调度、支持排队所有命令先进cuisineList排队想按优先级插队、延时执行、定时触发都只需操作这个列表。天然支持撤销与回滚因为动作本身是对象不执行就是撤销记下来重放就是回放。真实业务里订单取消、工单撤回、事务回滚都是这个思路。快速上手3步运行命令模式示例克隆代码仓库git clone https://gitcode.com/fuzhengwei/itstack-demo-design进入命令模式示例模块itstack-demo-design-14-02/执行mvn test运行 ApiTest.java观察四道菜的调度输出小结命令模式的精髓就一句话让命令成为对象调度、排队、撤销全部交给命令列表处理。itstack-demo-design 用小二、菜系、厨师三个角色把这一思想落地成了最朴素的代码——这也是它适合新手入门的原因。想系统学习更多场景可以看看项目里交易、营销、秒杀等 22 个真实案例的完整实现书籍简介见 README.md。【免费下载链接】itstack-demo-design:art: 《重学Java设计模式》是一本互联网真实案例实践书籍。以落地解决方案为核心从实际业务中抽离出交易、营销、秒杀、中间件、源码等22个真实场景来学习设计模式的运用。欢迎关注小傅哥微信(fustack)公众号bugstack虫洞栈博客https://bugstack.cn项目地址: https://gitcode.com/fuzhengwei/itstack-demo-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →