Java23种设计模式-行为型模式之命令模式

news/2024/9/23 10:25:54/

命令模式(Command Pattern):将一个请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。它通常用于解耦执行操作的对象与知道如何实现操作的对象。

基本组成:
Command(命令接口):定义了执行操作的方法,通常是一个抽象方法。
ConcreteCommand(具体命令类):实现了Command接口,它对应于具体的行为和接收者的绑定。
Client(客户端):创建具体的命令对象,并指定相应的接收者。
Invoker(调用者):要求命令对象执行请求。
Receiver(接收者):知道如何实施与执行一个请求相关的操作。
可选 - CommandFactory(命令工厂):用于创建不同类型的命令对象。

优点
降低系统的耦合度
新命令的添加对现有系统影响较小。
可以容易地实现对请求的排队记录撤销

缺点
可能会导致系统中命令类的数量过多。

应用场景
当需要将操作请求与操作实现分离,从而使得可以在不同的时间或不同的环境中执行请求时。
当需要支持撤销操作或重做操作时。
当需要将系统划分为不同的层次,每个层次使用不同的类时。

示例:简单的遥控器程序,用户可以通过遥控器来控制电视的开关:Command 是命令接口,ConcreteCommand 是具体命令类,它持有一个 Receiver 对象,负责将调用者请求的操作委托给 Receiver。Invoker 是调用者,它执行命令对象的 execute 方法。客户端创建命令对象和调用者对象,并通过调用者来执行命令

// 命令接口
public interface Command {void execute();
}
// 接收者
public class Receiver {public void action(){System.out.println("Action is performed");}
}
// 具体命令类
public class ConcreteCommand implements Command{private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action();}
}
// 调用者
public class Invoker {public void action(Command command){command.execute();}
}
//客户端
public class Client {public static void main(String[] args) {Receiver receiver=new Receiver();Command command=new ConcreteCommand(receiver);Invoker invoker=new Invoker();invoker.action(command);}
}

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

相关文章

uniapp问题归类

最近使用uniapp中,遇到了一些问题,这边mark下。 1. 启动页变形 设置启动页的时候发现在部分android手机上启动页被拉伸了,最后看了下官方建议使用9.png图 生成9.png地址,推荐图片大小为1080x2340 uniapp推荐官方地址传送门 我…

唯品会关键字搜索API接口:技术解析与应用实践

唯品会关键字搜索API接口深度解析:探索电商搜索新境界 在电商领域,搜索功能无疑是连接用户与商品的重要桥梁。唯品会作为国内知名的特卖电商平台,其关键字搜索API接口为开发者提供了高效、精准的搜索能力,助力商家提升用户体验、…

在VSCode中配置多个版本的Python环境,并设置PYTHONHOME环境变量

在VSCode中配置多个版本的Python环境,并设置PYTHONHOME环境变量,可以通过以下步骤进行: 安装多个版本的Python 首先,你需要在你的计算机上安装多个版本的Python。你可以从Python的官方网站下载不同版本的Python安装包&#xff0…

理解ROS2的动作

​ 1. 创建一个动作 目标: 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包: mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

上一节笔者给大家讲解了 JS 引擎解释执行到 import 语句的加载流程,总结起来就是利用 dlopen() 方法的加载特性向 NativeModuleManager 内部的链接尾部添加一个 NativeModule,没有阅读过上节文章的小伙伴,笔者强烈建议阅读一下,本…

JAVA实操代码练习2

JAVA实操代码练习2 代码合集01(两个数的最小公倍数;n 个自然数的立方和;抽奖程序)代码合集02(纸张对折、5的阶乘、鸡鸡同笼、大小马匹、回文数、跳跃弹球)代码合集01(两个数的最小公倍数;n 个自然数的立方和;抽奖程序) import java.util.Scanner;public class lianxi0…

LeetCode in Python 48. Rotate Image/Matrix (旋转图像/矩阵)

旋转图像/矩阵的重点是寻找旋转前后对应位置的坐标关系。 示例: 图1 旋转图像/矩阵的输入输出示意图 代码: class Solution:def rotate(self, matrix):n len(matrix)for i in range(n // 2):for j in range(i, n - 1 - i):topleft matrix[i][j]ma…

Python 全栈安全(三)

原文:annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者:飞龙 协议:CC BY-NC-SA 4.0 第十一章:OAuth 2 本章内容 注册 OAuth 客户端 请求对受保护资源的授权 授权而不暴露身份验证凭据 访问受保护的资源 OAuth …