【设计模式-命令】

news/2024/10/4 0:14:45/

定义

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使您能够使用不同的请求、排队请求或记录请求,并支持可撤销的操作。该模式通过将请求与其执行分离,使得请求者和接收者之间的耦合度降低。

UML图

在这里插入图片描述

  • Command(命令接口):定义一个接口,通常包含一个 execute() 方法。
  • ConcreteCommand(具体命令):实现命令接口,定义了与接收者的绑定,调用接收者的方法以实现请求。
  • Receiver(接收者):具体执行请求的类,包含执行相关操作的具体方法。
  • Invoker(调用者):持有命令对象并在需要时调用它。它可以调度请求并可以支持多种命令。
  • Client(客户端):创建具体命令对象并将其与接收者绑定,同时将命令对象传递给调用者。

代码

// Command interface
interface Command {void execute();
}// Receiver
class Light {public void turnOn() {System.out.println("Light is ON");}public void turnOff() {System.out.println("Light is OFF");}
}// ConcreteCommand for turning on the light
class TurnOnLightCommand implements Command {private Light light;public TurnOnLightCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}// ConcreteCommand for turning off the light
class TurnOffLightCommand implements Command {private Light light;public TurnOffLightCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}// Invoker
class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}// Client code
public class CommandPatternDemo {public static void main(String[] args) {Light light = new Light();Command turnOn = new TurnOnLightCommand(light);Command turnOff = new TurnOffLightCommand(light);RemoteControl remote = new RemoteControl();remote.setCommand(turnOn);remote.pressButton(); // Output: Light is ONremote.setCommand(turnOff);remote.pressButton(); // Output: Light is OFF}
}

优点

  • 解耦:请求者与接收者之间的解耦,使得系统更加灵活。
  • 可扩展性:可以轻松添加新的命令而不修改现有代码。
  • 支持撤销:可以实现命令的撤销和重做功能。

缺点

  • 命令对象数量多:如果命令数量较多,可能会增加系统的复杂性。
  • 实现复杂性:对于复杂的命令和接收者,可能需要更多的设计工作。

使用场景

  • 当需要将请求调用的对象和请求的执行对象解耦时。
  • 当需要支持撤销、重做操作时。
  • 当需要对请求进行日志记录或排队时。
  • 当需要实现事务处理时。

http://www.ppmy.cn/news/1533421.html

相关文章

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…

高精度(1)——高精度减法

题目描述 给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的差。 数据范围 1≤整数长度≤100000 输入样例 32 11 …

【2024】前端学习笔记11-网页布局-弹性布局flex

学习笔记 网页布局弹性布局:flex案例:flex布局案例 网页布局 在页面布局中,display属性用于设置一个元素的显示方式。它可以指定元素是作为块级元素、内联元素还是充当表格元素显示。 display的常见属性值: block:将…

解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘

问题现象: 某客户反馈在执行脚本的时候文件夹显示存在问题,如下图: 但是脚本文件中的内容并没有\r字符,如下图: 也有客户反馈如下: 问题分析: $\r’是回车符的转义表示。在Unix和Linux系统中,回车符是一个不可见的控制字符,它通常用于文本文件中的行结尾。以上…

Docker的实践应用举例

Docker作为一种流行的容器化技术,已经广泛应用于软件开发、部署、运维等多个领域。它通过将应用程序及其依赖项打包到可移植的容器中,极大地简化了应用的部署和管理过程。以下将详细探讨Docker的实践与应用,并通过多个具体例子来展示其强大的…

【d57】【sql】1661. 每台机器的进程平均运行时间

思路 一方面考察自连接,另一方面考察group by 这里主要说明 group by 用法: 1.在 SQL 查询中,GROUP BY 子句用于将结果集中的行分组,目的通常就是 对每个组应用聚合函数(如 SUM(), AVG(), MAX(), MIN(), COUNT() 等…

python-ds:Python 中的数据结构库(适用于面试的数据结构和算法合集)

在软件开发中,数据结构是组织和存储数据的方式,对算法的效率和程序的性能至关重要。Python 提供了许多内置的数据结构,但在一些复杂的应用场景中,原生数据结构可能无法满足特定需求。这时,一个功能强大、易于使用的数据…

Rainbond 助力城建智控,从传统开发到敏捷开发转型

在现代企业的数字化转型过程中,如何高效管理和快速部署业务应用已经成为各行业的核心挑战。尤其是在智慧工地和办公自动化(OA)这样的关键业务场景中,企业不仅需要面对频繁的系统更新,还要确保系统的稳定性与高效运作。…