做者:小傅哥
博客:https://bugstack.cn - 原创系列专题文章
html
沉淀、分享、成长,让本身和他人都能有所收获!😄
锲而不舍的重要性
java
初学编程每每都很懵,几乎在学习的过程当中会遇到各类各样的问题,哪怕别人那运行好好的代码,但你照着写完就报错。但好在你坚持住了,不然你可能看不到这篇文章。时间和成长就是相互关联着,你在哪条路上坚持走的久,就能看见那条的终点有多美,但若是你浪费了一次又一次努力的机会,那么你也会一样错过不少机遇,由于你的路换了。坚持学习、努力成长,持以恒的付出必定会有所收获。编程
学习方法的重要性
设计模式
不会学习每每会耽误不少时间,又没有可观的收成。但不会学习有时候是由于懒形成的,尤为是学习视频、书籍资料、技术文档等,若是只是看了却不是实际操做验证,那么真的很难把别人的知识让本身吸取,即便是当时感受会了也很快就会忘记。时而也常常会有人找到你说;“这个我不知道,你先告诉我,事后我就学。”但事后你学了吗?微信
你愿意为一个知识盲区付出多长时间
框架
你内心时而会蹦出这样的词吗;太难了我不会
、找我的帮一下吧
、放弃了放弃了
,其实谁均可能遇到很很差解决的问题,也是能够去问去咨询的。但,若是在这以前你没有在本身的大脑中反复的寻找答案,那么你的大脑中就不会造成一个凸点的知识树,缺乏了这个学习过程也就缺乏了查阅各类资料给本身大脑填充知识的机会,哪怕是问到了答案最终也会因时间流逝而忘记。函数
bugstack虫洞栈
,回复源码下载
获取(打开获取的连接,找到序号18)工程 | 描述 |
---|---|
itstack-demo-design-14-01 | 使用一坨代码实现业务需求 |
itstack-demo-design-14-02 | 经过设计模式优化代码结构,增长扩展性和维护性 |
命令模式在咱们一般的互联网开发中相对来讲用的比较少,但这样的模式在咱们的平常中却常用到,那就是Ctrl+C
、Ctrl+V
。固然若是你开发过一些桌面应用,也会感觉到这样设计模式的应用场景。从这样的模式感觉上,能够想到这是把逻辑实现与操做请求进行分离,下降耦合方便扩展。学习
命令模式是行为模式中的一种,以数据驱动的方式将命令对象
,可使用构造函数的方式传递给调用者。调用者再提供相应的实现为命令执行提供操做方法。可能会感受这部分有一些饶,能够经过对代码的实现进行理解,在经过实操来熟练。测试
在这个设计模式的实现过程当中有以下几个比较重要的点;优化
在这个案例中咱们模拟在餐厅中点餐交给厨师👨🍳烹饪的场景
命令场景的核心的逻辑是调用方与不须要去关心具体的逻辑实现,在这个场景中也就是点餐人员只须要把须要点的各类菜系交个小二
就能够,小二再把各项菜品交给各个厨师进行烹饪。也就是点餐人员不须要跟各个厨师交流,只须要在统一的环境里下达命令就能够。
在这个场景中能够看到有不一样的菜品;山东(鲁菜)、四川(川菜)、江苏(苏菜)、广东(粤菜)、福建(闽菜)、浙江(浙菜)、湖南(湘菜),每种菜品都会有不一样的厨师👩🍳进行烹饪。而客户并不会去关心具体是谁烹饪,厨师也不会去关心谁点的餐。客户只关心早点上菜,厨师只关心还有多少个菜要作。而这中间的衔接的过程,由小二完成。
那么在这样的一个模拟场景下,能够先思考🤔哪部分是命令模式的拆解,哪部分是命令的调用者以及命令的实现逻辑。
不考虑设计模式的状况下,在作这样一个点单系统,有一个类就够了
像是这样一个复杂的场景,若是不知道设计模式直接开发,也是能够达到目的的。但对于后续的各项的菜品扩展、厨师实现以及如何调用上会变得很是耦合难以扩展。
itstack-demo-design-14-01 └── src └── main └── java └── org.itstack.demo.design └── XiaoEr.java
public class XiaoEr { private Logger logger = LoggerFactory.getLogger(XiaoEr.class); private Map<Integer, String> cuisineMap = new ConcurrentHashMap<Integer, String>(); public void order(int cuisine) { // 广东(粤菜) if (1 == cuisine) { cuisineMap.put(1, "广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头"); } // 江苏(苏菜) if (2 == cuisine) { cuisineMap.put(2, "江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。"); } // 山东(鲁菜) if (3 == cuisine) { cuisineMap.put(3, "山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头."); } // 四川(川菜) if (4 == cuisine) { cuisineMap.put(4, "四川厨师,烹饪川菜,中国最有特点的菜系,也是民间最大菜系。"); } } public void placeOrder() { logger.info("菜单:{}", JSON.toJSONString(cuisineMap)); } }
order()
,另一个方法展现菜品的信息placeOrder()
。接下来使用命令模式来进行代码优化,也算是一次很小的重构。
命令模式能够将上述的模式拆解三层大块,命令、命令实现者、命令的调用者,当有新的菜品或者厨师扩充时候就能够在指定的类结构下进行实现添加便可,外部的调用也会很是的容易扩展。
itstack-demo-design-14-02 └── src ├── main │ └── java │ └── org.itstack.demo.design │ ├── cook │ │ ├── impl │ │ │ ├── GuangDongCook.java │ │ │ ├── JiangSuCook.java │ │ │ ├── ShanDongCook.java │ │ │ └── SiChuanCook.java │ │ └── ICook.java │ ├── cuisine │ │ ├── impl │ │ │ ├── GuangDoneCuisine.java │ │ │ ├── JiangSuCuisine.java │ │ │ ├── ShanDongCuisine.java │ │ │ └── SiChuanCuisine.java │ │ └── ICuisine.java │ └── XiaoEr.java └── test └── java └── org.itstack.demo.test └── ApiTest.java
命令模式模型结构
/** * 博客:https://bugstack.cn - 沉淀、分享、成长,让本身和他人都能有所收获! * 公众号:bugstack虫洞栈 * Create by 小傅哥(fustack) @2020 * * 菜系 * 0一、山东(鲁菜)——宫廷最大菜系,以孔府风味为龙头。 * 0二、四川(川菜)——中国最有特点的菜系,也是民间最大菜系。 * 0三、江苏(苏菜)——宫廷第二大菜系,古今国宴上最受人欢迎的菜系。 * 0四、广东(粤菜)——国内民间第二大菜系,国外最有影响力的中国菜系,能够表明中国。 * 0五、福建(闽菜)——客家菜的表明菜系。 * 0六、浙江(浙菜)——中国最古老的菜系之一,宫廷第三大菜系。 * 0七、湖南(湘菜)——民间第三大菜系。 * 0八、安徽(徽菜)——徽州文化的典型表明。 */ public interface ICuisine { void cook(); // 烹调、制做 }
广东(粤菜)
public class GuangDoneCuisine implements ICuisine { private ICook cook; public GuangDoneCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
江苏(苏菜)
public class JiangSuCuisine implements ICuisine { private ICook cook; public JiangSuCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
山东(鲁菜)
public class ShanDongCuisine implements ICuisine { private ICook cook; public ShanDongCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
四川(川菜)
public class SiChuanCuisine implements ICuisine { private ICook cook; public SiChuanCuisine(ICook cook) { this.cook = cook; } public void cook() { cook.doCooking(); } }
ICook
),并经过这个类提供的方法进行操做命令(烹饪菜品)cook.doCooking()
。public interface ICook { void doCooking(); }
粤菜,厨师
public class GuangDongCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头"); } }
苏菜,厨师
public class JiangSuCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。"); } }
鲁菜,厨师
public class ShanDongCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头"); } }
苏菜,厨师
public class SiChuanCook implements ICook { private Logger logger = LoggerFactory.getLogger(ICook.class); public void doCooking() { logger.info("四川厨师,烹饪川菜,中国最有特点的菜系,也是民间最大菜系。"); } }
public class XiaoEr { private Logger logger = LoggerFactory.getLogger(XiaoEr.class); private List<ICuisine> cuisineList = new ArrayList<ICuisine>(); public void order(ICuisine cuisine) { cuisineList.add(cuisine); } public synchronized void placeOrder() { for (ICuisine cuisine : cuisineList) { cuisine.cook(); } cuisineList.clear(); } }
@Test public void test(){ // 菜系 + 厨师;广东(粤菜)、江苏(苏菜)、山东(鲁菜)、四川(川菜) ICuisine guangDoneCuisine = new GuangDoneCuisine(new GuangDongCook()); JiangSuCuisine jiangSuCuisine = new JiangSuCuisine(new JiangSuCook()); ShanDongCuisine shanDongCuisine = new ShanDongCuisine(new ShanDongCook()); SiChuanCuisine siChuanCuisine = new SiChuanCuisine(new SiChuanCook()); // 点单 XiaoEr xiaoEr = new XiaoEr(); xiaoEr.order(guangDoneCuisine); xiaoEr.order(jiangSuCuisine); xiaoEr.order(shanDongCuisine); xiaoEr.order(siChuanCuisine); // 下单 xiaoEr.placeOrder(); }
菜品
与厨师
的组合;new GuangDoneCuisine(new GuangDongCook());
,每个具体的命令都拥有一个对应的实现类,能够进行组合。xiaoEr.order(guangDoneCuisine);
,这里分别添加了四种菜品,给小二。22:12:13.056 [main] INFO org.itstack.demo.design.cook.ICook - 广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头 22:12:13.059 [main] INFO org.itstack.demo.design.cook.ICook - 江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。 22:12:13.059 [main] INFO org.itstack.demo.design.cook.ICook - 山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头 22:12:13.059 [main] INFO org.itstack.demo.design.cook.ICook - 四川厨师,烹饪川菜,中国最有特点的菜系,也是民间最大菜系。 Process finished with exit code 0
命令
、实现
、调用者
,而这三块内容的拆分也是选择适合场景的关键因素,通过这样的拆分可让逻辑具有单一职责的性质,便于扩展。