设计模式十五:行为型-命令模式
行为型模式:命令模式
文章目录
- 行为型模式:命令模式
- 命令模式
- 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、命令模式:总结
- 命令模式分为 命令者、实现者和调用者。而这三块内容的拆分也是选择场景的关键因素,经过拆分,可以让逻辑具备单一职责的性质,便于扩展
- 问题:在各种命令与实现者的组合下,会扩展出很多的实现类,需要管理。
设计模式十五:行为型-命令模式相关推荐
- 【每天一个java设计模式(十五)】 - 命令模式
命令模式是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 命令模式也就是一个 ...
- 设计模式(五):命令模式
一.定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 我觉得可以这样:将一个请求封装为一个对象,对请求排队或记录请求日志,以及支 ...
- 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)
设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...
- Git命令集十五——拉取命令
2019独角兽企业重金招聘Python工程师标准>>> Git命令集十五--拉取命令 pull命令用于从其他仓库或本地分支拉取更改到当前分支. 1.git pull 将远程仓库的更改 ...
- 45.深度解密四十五:网站盈利模式和私域流量的变现方式细致讲解
网络营销推广技术.技巧深度解密(四十五)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解网站的盈利模式和私域流量变现的方式问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为 ...
- 设计模式(一):命令模式(2)——命令模式扩展之宏命令
前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)--基本的命令模式 设计模式(一):命令模式(2)--命令模式扩展之宏命令 设计模式(一):命令模式(3)--命令模式扩展之队列请求 设计 ...
- 设计模式的C语言应用-命令模式-第五章
模式介绍:命令模式(command) 命令模式的解释如下: 向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封 ...
- [设计模式-行为型]命令模式(Command)
一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有 ...
- python 命令模式_python设计模式(十六):命令模式-阿里云开发者社区
"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这 ...
最新文章
- shell --- awk规范 系统总结
- oracle个性化,Oracle:个性化营销成功的五细则
- 冲刺区块链第一股,也是AI芯片第一股,嘉楠在美提交IPO招股书
- 广度优先搜索(BFS)与深度优先搜索(DFS)
- FreeModbus ASCII传输
- [转]JavaSE学习 Swing(二)
- java doubke类型转换为String_Java的基本数据类型你知道吗?
- MongoDB 在windows shell环境下的基本操作和命令的使用示例(五)
- 线程的创建方式及Runnable与Callable的区别
- FastStone Capture—屏幕录像
- QQ连连看6.0 逆向分析
- 计算机A类会议 icip,计算机视觉|中国计算机学会推荐国际学术刊物/会议
- 菜鸟的Vue基础快速入门
- WiFi-ESP8266入门http(3-4)网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信...
- 微信公众号怎么添加附件?
- Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!
- 连连支付怎么样?最新连连跨境支付详情介绍!
- python做后端的优势_python做后端好吗
- Poly定理:学习笔记
- Paper Reading:U-Net