小侃设计模式(十五)-命令模式
创始人
2024-03-20 23:53:52
0

1.概述

命令模式(Command Pattern)是将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。它是行为型模式的一种,能够有效降低系统间的耦合性。本文将详述命令模式的设计原理及使用。

2.原理及使用

2.1 原理

命令模式是对命令的一个封装,它将发出命令的责任和执行命令的责任进行分开,委派给不同的对象。命令模式的类图如下所示:
在这里插入图片描述

命令模式涉及到五个角色,它们分别是:

  • 客户端角色(Client):创建一个具体命令对象并确定其接收者;
  • 命令角色(Command):声明一个所有命令类实现的抽象接口;
  • 具体命令角色(ConcreteCommand):定义一个接收者和其实现的一个弱耦合,它实现命令角色(Command)中的execute()方法,execut()方法调用具体的接收者Receiver中的方法进行实现;
  • 请求者角色(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法;
  • 接收者角色(Receiver):请求的具体实现对象,任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

2.2 案例

饭店里有做各种不同菜系的厨子,有湘菜厨子、徽菜厨子、川菜厨子、粤菜厨子等,客人会找服务员进行点菜,服务员会根据客人点的不同的菜找不同的厨师加工。

在上述案例中,客户端角色就相当于客户,发出请求,服务员相当于请求者角色,请求厨子去按用户要求做菜,接收者角色就是具体的厨师,具体类图如下:

在这里插入图片描述

代码实现如下:

//烹饪命令角色
public interface Cooking {void execute();}//徽菜做法
public class HuiCooking implements Cooking{private HuiCooker cooker;public HuiCooking(HuiCooker cooker) {this.cooker = cooker;}@Overridepublic void execute() {cooker.act();}
}//粤菜做法
public class YueCooking implements Cooking {private YueCooker cooker;public YueCooking(YueCooker cooker) {this.cooker = cooker;}@Overridepublic void execute() {cooker.act();}}//粤菜厨子角色
public class YueCooker {public void act() {System.out.println("粤菜厨子,做的一手好粤菜,正在烹饪粤菜");}}//徽菜厨子角色
public class HuiCooker  {public void act() {System.out.println("徽菜厨子,做的一手好徽菜,正在烹饪徽菜");}}//服务员,请求者角色
public class Waiter {private List orders = new ArrayList<>();public void setOrders(Cooking cooking) {orders.add(cooking);}//下单public void placeOrder() {for (Cooking order : orders) {order.execute();}orders.clear();}}//测试类
public class Client {public static void main(String[] args) {YueCooker yueCooker = new YueCooker();HuiCooker huiCooker = new HuiCooker();YueCooking yueCooking = new YueCooking(yueCooker);HuiCooking huiCooking = new HuiCooking(huiCooker);Waiter waiter = new Waiter();//客户点个粤菜waiter.setOrders(yueCooking);//客户点个徽菜waiter.setOrders(huiCooking);//服务员下单waiter.placeOrder();}}

测试结果如下:

在这里插入图片描述

2.3 命令模式的优缺点

2.3.1 优点

1.松耦合:命令模式将命令发起者与接收者对象进行解耦,发起者不知道接收者的具体对象,
2.扩展性更强:若增加新的命令对象,只需扩展命令接口,然后将具体命令对象装配即可;
3.控制更灵活:命令模式可以将请求封装,动态进行参数化、队列化等,使系统更加灵活。

2.3.2 缺点

1.增加系统的复杂度:可能导致某些系统有较多的命令类,增加系统复杂度;
2.请求者和接收者之间仍然存在耦合,若接收者变更,请求者也要进行代码变更。

2.4 注意事项和细节

命令模式的经典使用场景:界面的每一个按钮都是一个命令、模拟CMD(DOS命令)、订单的撤销/恢复、触发-反馈机制等。

3.小结

1.命令模式最大的优点在于将请求与具体的实现对象进行解耦,使得请求命令易于扩展;
2.它的优点也是它的缺点,当系统中命令过多时,容易造成类爆炸,所以要根据场景进行模式识别与组合。

4.参考文献

1.《设计模式之禅》-秦小波著
2.《大话设计模式》-程杰著
3.https://www.cnblogs.com/betterboyz/p/9377991.html

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...