Command(命令模式)行为型

news/2025/4/1 6:12:40/

这命令模式

  • 一、概述
    • 二、结构
      • 三、实例
      • 四、适用场景
      • 五、优缺点

一、概述

描述:看电视时,只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。

定义:命令是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作

二、结构

  1. 发送者(Sender)——亦称“触发者(Invoker)”——类负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。发送者触发命令,而不向接收者直接发送请求。注意,发送者并不负责创建命令对象:它通常会通过构造函数从客户端处获得预先生成的命令。
  2. 命令(Command)接口通常仅声明一个执行命令的方法。
  3. 具体命令(Concrete Commands)会实现各种类型的请求。具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。但为了简化代码,这些类可以进行合并。接收对象执行方法所需的参数可以声明为具体命令的成员变量。你可以将命令对象设为不可变,仅允许通过构造函数对这些成员变量进行初始化。
  4. 接收者(Receiver)类包含部分业务逻辑。几乎任何对象都可以作为接收者。绝大部分命令只处理如何将请求传递到接收者的细节,接收者自己会完成实际的工作。
    1. 客户端(Client)会创建并配置具体命令对象。客户端必须将包括接收者实体在内的所有请求参数传递给命令的构造函数。此后,生成的命令就可以与一个或多个发送者相关联了。

在这里插入图片描述

三、实例


#include<iostream>
#include<string>
#include<memory>
using namespace std;// 命令接口, C++中为抽象基类
class Command {
public:virtual void execute() = 0;
};// 具体命令类: 打开电视
class TVOpenCommand :public Command {
private:shared_ptr<Television> tv_;
public:explicit TVOpenCommand(shared_ptr<Television> tv):tv_(tv){}void execute() {tv_->open();}
};// 具体命令类: 关闭电视
class TVCloseCommand : public Command {
private:shared_ptr<Television> tv_;
public:explicit TVCloseCommand(std::shared_ptr<Television> tv) : tv_(tv) {}void execute() {tv_->close();}
};// 具体命令类: 切换频道
class TVChangeCommand : public Command {
private:shared_ptr<Television> tv_;public:explicit TVChangeCommand(std::shared_ptr<Television> tv) : tv_(tv) {}void execute() {tv_->changeChannel();}};// 触发者: 遥控器
class Controller
{
private:shared_ptr<Command> cmd_;
public:Controller() {}// 设置命令void setCommand(shared_ptr<Command> cmd) {cmd_ = cmd;}// 执行命令void executeCommand() {cmd_->execute();}
};// 接受者: 电视
class Television {
public:void open() {cout << "打开电视机!" << endl;}void close() {cout << "关闭电视机!" << endl;}void changeChannel() {cout << "切换电视频道!" << endl;}
};int main()
{// 接收者: 电视机Television *tv = new Television();shared_ptr<Television> tv = make_shared<Television>();//命令shared_ptr<Command> openCommand = make_shared<TVOpenCommand>(tv);shared_ptr<Command> closeCommand = make_shared<TVCloseCommand>(tv);shared_ptr<Command> changeCommand = make_shared<TVChangeCommand>(tv);//调用者:遥控器shared_ptr<Controller> controller = make_shared<Controller>();//测试controller->setCommand(openCommand);controller->executeCommand();controller->setCommand(closeCommand);controller->executeCommand();controller->setCommand(changeCommand);controller->executeCommand();}

在这里插入图片描述

四、适用场景

  1. 需要通过操作来参数化对象,可使用命令模式。
  2. 想要将操作放入队列中、操作的执行或者远程执行操作,可使用命令模式。
  3. 想要实现操作回滚功能,可使用命令模式。

五、优缺点

优点:

  1. 单一职责原则,可以解耦触发和执行操作的类。
  2. 开闭原则。你可以在不修改已有客户端代码的情况下在程序中创建新的命令。
  3. 可以实现撤销和恢复功能。
  4. 实现操作的延迟执行。
  5. 将一组简单命令组合成一个复杂命令。

缺点:

命令很多,增加系统复杂性。


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

相关文章

col command

文章目录 1.命令简介2.命令格式3.选项说明4.常用示例5.相关疑问参考文献 1.命令简介 col&#xff08;control&#xff09;是一个标准输入文本过滤器。 col 从标准输入读取内容&#xff0c;过滤掉控制字符反向换行符&#xff08;RLF-Reverse Line Feed&#xff09;和半反向换行…

Commander基本使用

随着NodeJs的不断发展&#xff0c;对于前端来说要做的东西也就更多&#xff0c;Vue脚手架React脚手架等等等一系列的东西都脱颖而出&#xff0c;进入到人们的视野当中&#xff0c;对于这些脚手架工具来讲也只是停留在应用阶段&#xff0c;从来没有想过脚手架是如何实现的&#…

commander

node.js命令行界面的完整解决方案&#xff0c;受Ruby Commander启发。 原理: 当一个Nodejs程序运行时,process对象中有一个叫做argv的属性。命令行程序的第一个重头戏就是解析这个process.argv属性。 定义一个hello脚本,打印一下process.argv #!/usr/bin/env node console.…

Commander入门

Commander框架简介 Commander.js是一个Node.js的轻量级命令行框架&#xff0c;用于创建命令行应用程序。Commander.js提供了对应用程序命令行告知用户的友好界面&#xff0c;并应用了普遍认同的GNU和Unix标准选项。 Commander官方文档 脚手架的介绍及开发流程 基本用法 1.引入…

Command(命令)模式

目录 前言一、命令模式总结1、模式意图2、参与者3、结构、协作、适用性及效果 二、命令模式简单示例1、用例描述2、示例代码 总结 前言 本周五参加了Command&#xff08;命令 &#xff09;模式研讨会&#xff0c;本文的目的是对这个模式的总结和分享&#xff0c;希望对需要学习…

Commander(指挥官)介绍

7. Docker 管理 能对docker进行远程管理 Docker基础信息 Docker容器列表 Docker镜像列表 部署容器 : 例如部署一个nginx 拉取镜像 容器 - 查看容器详情 容器 - 停止 与 停止并删除 容器 容器 - 查看容器日志 容器 - 查看进程 容器 - 修改容器名称 容器 - 重启容器 容器 - 实时…

commando VM 安装

火眼发布Windows渗透工具包&#xff08;CommandoVM&#xff09; 包含140个渗透工具 工具下载地址&#xff1a;github.com/fireeye/commando-vm Kali Linux 已成为攻击型安全专家的标配工具&#xff0c;但对需要原生Windows功能的渗透测试员来说&#xff0c;维护良好的类似工具…

Commando War UVA - 11729 突击战

题目链接 突击战 你有n个部下&#xff0c;每个部下需要完成一项任务。第i个部下需要你花Bi分钟交代任务&#xff0c;然后他会独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序&#xff0c;使得所有任务尽早执行完毕&#xff08;即最后一个执行完的任务应尽早结…