行为型模式:命令模式

文章目录

  • 行为型模式:命令模式
    • 命令模式
      • 1、命令模式:介绍
      • 2、命令模式:模拟场景
      • 3、命令模式:代码实现
      • 4、命令模式:总结

命令模式

1、命令模式:介绍

  • 命令模式

    • 把逻辑实现与操作请求分离,降低耦合,方便扩展
    • 命令模式是行为模式中的一种,以数据驱动的方式将命令对象用构造函数的方式传递给调用者。
    • 调用者再提供相应的实现,为命令执行提供操作方法。
  • 命令模式的实现
    • 抽象命令类:声明执行命令的接口和方法
    • 具体的命令实现类:接口类的具体实现可以是一组相似的行为逻辑
    • 实现者:给命令开发执行逻辑的具体实现类
    • 调用者:处理命令、实现的具体操作者,负责对外提供命令服务

2、命令模式:模拟场景

  • 餐厅点餐场景

    • 模拟在餐厅里点餐,并交给厨师烹饪的场景
  • 命令模式的核心逻辑是调用方不需要关心具体的逻辑实现
    • 顾客只需要把点的菜交给服务员就可以,服务员再请厨师烹饪。
    • 顾客不需要与厨师交流,只需和服务员沟通就可以。

3、命令模式:代码实现

0、工程结构

lino-design-16.0
|——src|——main|--java|--com.lino|--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|--com.lino.test|--Test.java

1、抽象实现者定义(厨师接口)

/*** @description: 厨师接口*/
public interface ICook {/*** 烹饪*/void doCooking();
}

2、实现者具体实现(四种厨师)

  • 粤菜厨师
import com.lino.cook.ICook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 粤菜厨师*/
public class GuangDongCook implements ICook {/*** 日志*/private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("广东厨师,烹饪粤菜,国内民间第二大菜系,国外最有影响力的菜系之一。");}}
  • 苏菜厨师
import com.lino.cook.ICook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 苏菜厨师*/
public class JiangSuCook implements ICook {/*** 日志*/private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("江苏厨师,烹饪苏菜,宫廷菜系,古今国宴上最受人欢迎的菜系。");}
}
  • 鲁菜厨师
import com.lino.cook.ICook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 鲁菜厨师*/
public class ShanDongCook implements ICook {/*** 日志*/private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头");}
}
  • 川菜厨师
import com.lino.cook.ICook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 川菜厨师*/
public class SiChuanCook implements ICook {/*** 日志*/private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("四川厨师,烹饪川菜,中国最有特色的菜系,也是民间喜欢的菜系之一。");}
}

3、抽象命令定义(菜品接口)

/*** @description: 菜品接口*/
public interface ICuisine {/*** 烹饪,制作*/void cook();
}

4、具体命令实现(四种菜品)

  • 广东(粤菜)
import com.lino.cook.ICook;
import com.lino.cuisine.ICuisine;/*** @description: 广东(粤菜)*/
public class GuangDoneCuisine implements ICuisine {private ICook cook;public GuangDoneCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}
  • 江苏(苏菜)
import com.lino.cook.ICook;
import com.lino.cuisine.ICuisine;/*** @description: 江苏(苏菜)*/
public class JiangSuCuisine implements ICuisine {private ICook cook;public JiangSuCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}
  • 山东(鲁菜)
import com.lino.cook.ICook;
import com.lino.cuisine.ICuisine;/*** @description: 山东(鲁菜)*/
public class ShanDongCuisine implements ICuisine {private ICook cook;public ShanDongCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}
  • 四川(川菜)
import com.lino.cook.ICook;
import com.lino.cuisine.ICuisine;/*** @description: 四川(川菜)*/
public class SiChuanCuisine implements ICuisine {private ICook cook;public SiChuanCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}

5、调用者(店小二)

  • 在调用者的具体实现中,提供了菜品的添加和菜单执行烹饪任务。
  • 这个过程是命令模式的具体调用,通过外部接口调用,将菜品实现类和厨师实现类传递进来
import com.lino.cuisine.ICuisine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;/*** @description: 调用者:饭店小二,负责点单*/
public class XiaoEr {/*** 日志*/private Logger logger = LoggerFactory.getLogger(XiaoEr.class);/*** 菜品集合*/private List<ICuisine> cuisineList = new ArrayList<ICuisine>();/*** 添加菜品** @param cuisine 菜品*/public void order(ICuisine cuisine) {cuisineList.add(cuisine);}/*** 烹饪*/public synchronized void placeOrder() {for (ICuisine cuisine : cuisineList) {cuisine.cook();}cuisineList.clear();}
}

6、单元测试

  • 主要观察菜品和厨师的组合:new GuangDoneCuisine(new GuangDongCook())
  • 每一个具体的命令都拥有一个对应的实现类,可以组合。
  • 当定义完菜品和具体的实现后,由店小二操作点单 xiaoEr.order(guangDoneCuisine),这里分别给店小二添加了四种菜品。
  • 最后是下单,是具体命令实现的操作,相当于把店小二手里的菜单转给厨师。
import com.lino.XiaoEr;
import com.lino.cook.impl.GuangDongCook;
import com.lino.cook.impl.JiangSuCook;
import com.lino.cook.impl.ShanDongCook;
import com.lino.cook.impl.SiChuanCook;
import com.lino.cuisine.ICuisine;
import com.lino.cuisine.impl.GuangDoneCuisine;
import com.lino.cuisine.impl.JiangSuCuisine;
import com.lino.cuisine.impl.ShanDongCuisine;
import com.lino.cuisine.impl.SiChuanCuisine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.ParseException;/*** @description: 测试类*/
public class Test {@org.junit.Testpublic void testXiaoEr() throws ParseException {// 菜系 + 厨师;广东(粤菜)、江苏(苏菜)、山东(鲁菜)、四川(川菜)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();}
}
  • 测试结果
14:52:58.315 [main] INFO  com.lino.cook.ICook - 广东厨师,烹饪粤菜,国内民间第二大菜系,国外最有影响力的菜系之一。
14:52:58.319 [main] INFO  com.lino.cook.ICook - 江苏厨师,烹饪苏菜,宫廷菜系,古今国宴上最受人欢迎的菜系。
14:52:58.319 [main] INFO  com.lino.cook.ICook - 山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头
14:52:58.319 [main] INFO  com.lino.cook.ICook - 四川厨师,烹饪川菜,中国最有特色的菜系,也是民间喜欢的菜系之一。

4、命令模式:总结

  • 命令模式分为 命令者、实现者和调用者。而这三块内容的拆分也是选择场景的关键因素,经过拆分,可以让逻辑具备单一职责的性质,便于扩展
  • 问题:在各种命令与实现者的组合下,会扩展出很多的实现类,需要管理。

设计模式十五:行为型-命令模式相关推荐

  1. 【每天一个java设计模式(十五)】 - 命令模式

    命令模式是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 命令模式也就是一个 ...

  2. 设计模式(五):命令模式

    一.定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 我觉得可以这样:将一个请求封装为一个对象,对请求排队或记录请求日志,以及支 ...

  3. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

  4. Git命令集十五——拉取命令

    2019独角兽企业重金招聘Python工程师标准>>> Git命令集十五--拉取命令 pull命令用于从其他仓库或本地分支拉取更改到当前分支. 1.git pull 将远程仓库的更改 ...

  5. 45.深度解密四十五:网站盈利模式和私域流量的变现方式细致讲解

    网络营销推广技术.技巧深度解密(四十五)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解网站的盈利模式和私域流量变现的方式问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为 ...

  6. 设计模式(一):命令模式(2)——命令模式扩展之宏命令

    前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)--基本的命令模式 设计模式(一):命令模式(2)--命令模式扩展之宏命令 设计模式(一):命令模式(3)--命令模式扩展之队列请求 设计 ...

  7. 设计模式的C语言应用-命令模式-第五章

    模式介绍:命令模式(command) 命令模式的解释如下: 向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封 ...

  8. [设计模式-行为型]命令模式(Command)

    一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有 ...

  9. python 命令模式_python设计模式(十六):命令模式-阿里云开发者社区

    "行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这 ...

最新文章

  1. shell --- awk规范 系统总结
  2. oracle个性化,Oracle:个性化营销成功的五细则
  3. 冲刺区块链第一股,也是AI芯片第一股,嘉楠在美提交IPO招股书
  4. 广度优先搜索(BFS)与深度优先搜索(DFS)
  5. FreeModbus ASCII传输
  6. [转]JavaSE学习 Swing(二)
  7. java doubke类型转换为String_Java的基本数据类型你知道吗?
  8. MongoDB 在windows shell环境下的基本操作和命令的使用示例(五)
  9. 线程的创建方式及Runnable与Callable的区别
  10. FastStone Capture—屏幕录像
  11. QQ连连看6.0 逆向分析
  12. 计算机A类会议 icip,计算机视觉|中国计算机学会推荐国际学术刊物/会议
  13. 菜鸟的Vue基础快速入门
  14. WiFi-ESP8266入门http(3-4)网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信...
  15. 微信公众号怎么添加附件?
  16. Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!
  17. 连连支付怎么样?最新连连跨境支付详情介绍!
  18. python做后端的优势_python做后端好吗
  19. Poly定理:学习笔记
  20. Paper Reading:U-Net

热门文章

  1. 职场精神控制:权力,舆论,引起多数人共鸣,孤立对手。
  2. 【立创机械狗从0到成品PCB画图总结】
  3. 二十几岁女孩应有的思想
  4. 极速office2021怎么给PPT添加页脚呢
  5. 基于Vue的后台选择推荐
  6. python字符串的基本处理_python 字符串处理
  7. 如何在PC上正确播放4K HDR视频--有惊喜
  8. 自学AE AK大神笔记021_模拟枪口火光
  9. mac 操作系统 ios操作系统
  10. 二叉搜索树的创建以及删除