当前位置: 首页 > web >正文

【设计模式-4.9】行为型——命令模式

说明:本文介绍行为型设计模式之一的命令模式

定义

命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求方发出请求需要执行一个操作;接收方收到请求,并执行操作。命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令怎样被接收、怎样被操作及是否被执行等。命令模式属于行为型设计模式。

(引自《设计模式就该这样学》P339)

灯泡开关设计

在实际生活中,发起命令和执行命令,大多是强绑定的,例如开车,一个操作对应就是一个反馈,但在程序设计上,考虑扩展性,就不能这样设计。

以灯泡开关为例,如下,是一个灯泡开关的设计

(灯泡,Bulb)

/*** 灯泡*/
public class Bulb {/*** 开灯*/public void on() {System.out.println("灯亮。。。");}/*** 关灯*/public void off() {System.out.println("灯灭。。。");}
}

(灯泡开关,Switcher)

/*** 开关*/
public class Switcher {/*** 定义灯泡*/private Bulb bulb;public Switcher(Bulb bulb) {this.bulb = bulb;}/*** 按下按钮*/public void buttonPush() {System.out.println("按下按钮");bulb.on();}/*** 弹起按钮*/public void buttonPop() {System.out.println("弹起按钮");bulb.off();}
}

(客户端使用,Client)

public class Client {public static void main(String[] args) {Bulb bulb = new Bulb();Switcher switcher = new Switcher(bulb);// 开灯switcher.buttonPush();;// 关灯switcher.buttonPop();}
}

如下

在这里插入图片描述

分析,以上代码就是关于灯泡开关的强绑定设计,开关只能对灯泡使用,灯泡只能被这个开关开启/关闭。


使用命令模式改进,如下,

(先定义一个命令接口,Command)

/*** 命令接口*/
public interface Command {/*** 执行*/void execute();/*** 反向执行*/void unexecute();
}

(灯泡命令,实现命令接口,BulbCommand)

/*** 灯泡命令*/
public class BulbCommand implements Command {/*** 定义灯泡*/private Bulb bulb;public BulbCommand(Bulb bulb) {this.bulb = bulb;}@Overridepublic void execute() {System.out.println("按下按钮");bulb.on();}@Overridepublic void unexecute() {System.out.println("弹起按钮");bulb.off();}
}

开关这里,不直接定义灯泡,而是定义命令,调用对应方法,如下

/*** 开关*/
public class Switcher {/*** 定义命令*/private Command command;/*** 设置命令*/public void setCommand(Command command) {this.command = command;}/*** 按下按钮*/public void buttonPush() {command.execute();}/*** 弹起按钮*/public void buttonPop() {command.unexecute();}
}

客户端使用

public class Client {public static void main(String[] args) {// 创建开关Switcher switcher = new Switcher();// 创建灯泡Bulb bulb = new Bulb();// 创建灯泡命令Command switcherCommand = new BulbCommand(bulb);// 绑定switcher.setCommand(switcherCommand);// 执行switcher.buttonPush();// 反向执行switcher.buttonPop();}
}

执行,改造完成

在这里插入图片描述

分析可以发现,命令模式,通过新增一个接口(Command),实现了命令与操作的解耦。基于改造后的代码,扩展灯泡亮起的实现方式,可以新建一个BulbCommand类,如NewBulbCommand,写新的实现逻辑,使用的时候直接调用setCommand(newBulbCommand)方法即可,而扩展其他使用场景,也只需定义新的对象、新的命令即可,非常灵活。

使用场景

在《设计模式就该这样学》(P340)这本书中,提到命令模式适用于以下场景:

(1)现实语义中具备“命令”的操作(如命令菜单、Shell命令等)。

(2)请求的调用者和接收者需要解耦,使得调用者和接收者不直接交互。

(3)需要抽象出等待执行的行为,比如撤销(Undo)操作和恢复(Redo)等操作。

即等待多久后,默认执行的场景,如红帽的Linux操作系统和MacOS操作系统,点击关机,1分钟未确认自动执行关机

(4)需要支持命令宏(即命令组合操作)。

即执行操作的命令来源不是单一的,可能来自多个

总结

本文介绍了行为型设计模式中的命令模式,参考《设计模式就该这样学》、《秒懂设计模式》两书,灯泡开关设计是《秒懂设计模式》中的举例。

http://www.xdnf.cn/news/11916.html

相关文章:

  • 解决Required request part ‘file‘ is not present
  • StarRocks与Apache Iceberg:构建高效湖仓一体的实时分析平台
  • OPENCV重点结构体Mat的讲解
  • 数据结构 [一] 基本概念
  • 第二章 2.2 数据存储安全风险之数据存储风险分析
  • 0. MySQL在Centos 7环境安装
  • flask功能使用总结和完整示例
  • 分布式互斥算法
  • 【C语言练习】080. 使用C语言实现简单的数据库操作
  • Vue + Element Plus 实战:大文件切片上传 + 断点续传
  • [蓝桥杯]小计算器
  • Git-git跟踪大文件
  • Git的使用技巧
  • hive 3集成Iceberg 1.7中的Java版本问题
  • HarmonyOS NEXT应用开发-Notification Kit(用户通知服务)更多系统能力
  • JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/等待通知机制/锁消除
  • Quipus系统的视频知识库的构建原理及使用
  • C++ 新特性详解:Lambda 表达式全解析(含实战案例)
  • 计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)
  • OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()
  • 自动化生产线,IT部署一站式解决方案-Infortrend KS私有云安全,一机多用
  • [蓝桥杯]模型染色
  • 软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码
  • 如何借助Hyper - V在Windows 10中构建安全软件测试环境
  • 编译一个Mac M系列可以用的yuview
  • 设计模式-迪米特法则
  • 2025年- H69-Lc177--78.子集(回溯,组合)--Java版
  • 2025年想冲网安方向,该考华为安全HCIE还是CISSP?
  • 界面组件DevExpress WPF中文教程:Grid - 如何识别行和卡片?
  • 深度解析Mysql中MVCC的工作机制