(七)Python 命令模式

news/2024/4/24 4:07:19/

文章目录

  • 1 命令模式简介
  • 2 命令模式的特点和目的
    • 2.1 命令模式通常使用以下术语:
      • 2.1.1 命令模式的UML类图
    • 2.2 命令模式的主要目的如下
    • 2.3 命令模式可用于以下各种情景:
  • 3 命令模式python代码示例
  • 4 命令模式的优点和缺点
    • 4.1 优点
    • 4.2 缺点

1 命令模式简介

正如我们在上一章中所看到的那样,行为模式侧重于对象的响应性。它利用对象之间的交互实现更强大的功能。命令模式也是一种行为设计模式,其中对象用于封装在完成一项操作时或在触发一个事件时所需的全部信息。这些信息包括以下内容:

  1. 方法名称;
  2. 拥有方法的对象;
  3. 方法参数的值。

我们用一个非常简单的软件例子来理解该模式,如安装向导。通常情况下,安装向导通过多个步骤或屏幕来了解用户的偏好。因此,当用户使用向导时,他/她需要做出某些选择。通常来说,向导可以使用命令模式来实现。向导首先会启动一个名为 command 的对象。用户在向导的多个步骤中指定的首选项或选项将存储在 command 对象中。当用户在向导的最后一个屏幕上单击 Finish 按钮时,Command 对象就会运行execute()方法该方法会考察所有存储的选项并完成相应的安装过程。因此,关于选择的所有信息被封装在稍后用于采取动作的对象中。

2 命令模式的特点和目的

2.1 命令模式通常使用以下术语:

  • Command、Receiver、Invoker 和 client:Command 对象了解 Receiver 对象的情况,并能调用 Receiver 对象的方法
  • 调用者方法的参数值存储在command 对象中;
  • 调用者知道如何执行命令;
  • 客户端用来创建command 对象并设置其接收者。

2.1.1 命令模式的UML类图

在这里插入图片描述
整个流程图是非常简单的,客户端请求执行命令,调用者接受命令,封装它并将其放置到队列中。ConcreteCommand类根据所请求的命令来指导接收者执行特定的动作。

2.2 命令模式的主要目的如下

  • 将请求封装为对象。
  • 可用不同的请求对客户进行参数化。
  • 允许将请求保存在队列中(我们将在本章后面进行讨论)。
  • 提供面向对象的回调。

2.3 命令模式可用于以下各种情景:

  • 根据需要执行的操作对对象进行参数化。
  • 将操作添加到队列并在不同地点执行请求;。
  • 创建一个结构来根据较小操作完成高级操作

3 命令模式python代码示例

场景:假设我们想要开发一个安装向导,或者更常见的安装程序。通常,安装意味着需要根据用户做出的选择来复制或移动文件系统中的文件。在下面的示例中,我们首先在客户端代码中创建Wizard 对象,然后使用preferences()方法存储用户在向导的各个屏幕期间做出的选择。在向导中单击 Finish 按钮时,就会调用 execute()方法。之后,execute()方法将会根据首选项来开始安装。

class Wizard():def __init__(self, src, rootdir):self.choices = []self.rootdir = rootdirself.src = srcdef preferences(self, command):self.choices .append(command)def execute(self):for choice in self.choices:if list(choice.values())[0]:print("Copying binaries --", self.src," to ",self.rootdir)else:print("No Operation")
if __name__ == '__main__':## Client codewizard = Wizard('python3.5.gzip','/usr/bin/')## Users chooses to installPythononlywizard.preferences({'python':True})wizard.preferences({'java':False})wizard.execute()

4 命令模式的优点和缺点

4.1 优点

  • 将调用操作的类与知道如何执行该操作的对象解耦。
  • 提供队列系统后,可以创建一系列命令。
  • 添加新命令更加容易,并且无需更改现有代码。
  • 还可以使用命令模式来定义回滚系统,例如,在向导示例中,我们可以编写一个回滚方法。

4.2 缺点

  • 为了实现目标,需要大量的类和对象进行协作。应用程序开发人员为了正确开发这些类,需要倍加小心;
  • 每个单独的命令都是一个 concreteCommand 类,从而增加了需要实现和维护的类的数量。

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

相关文章

clickhouse数据库磁盘空间使用率过高问题排查

一、前言 clickhouse天天触发磁盘使用率过高告警,所以需要进行排查,故将排查记录一下。 二、排查过程 1、连接上进入clickhouse 2、执行语句查看各库表使用磁盘情况 SELECT database, table, formatReadableSize(sum(bytes_on_disk)) as disk_space F…

「斗破年番」卡点侠萧炎又卡点救人,四长老毒气攻心,黑皇城寻宝

Hello,小伙伴们,我是拾荒君。 《斗破苍穹年番》第74集如约而至,带给观众们更多的惊喜与感动。这一集中,萧炎的体内魔毒斑暂时被厄难毒体所压制,他决定回到迦南学院,寻求斗尊强者的帮助解决这个问题。然而,…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中,我们已经介绍完了MVC的架构和实现,现在我们来讲一下,SAPUI5的结构 这一步,我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立,可复用了。这样,无所什么时候我…

uniapp实战 —— 自定义顶部导航栏

效果预览 下图中的红框区域 范例代码 src\pages.json 配置隐藏默认顶部导航栏 "navigationStyle": "custom", // 隐藏默认顶部导航src\pages\index\components\CustomNavbar.vue 封装自定义顶部导航栏的组件(要点在于:获取屏幕边界…

STL(八)(总结篇)

###以四道题来总结 题号:lanqiao OJ 3226 1.宝藏排序II ### 这道题主要考察sort,非常简单输出就是升序不需要自定义比较函数 #include<bits/stdc.h> using namespace std; const int N1e55; //这里用int就足够了不需要开long long int a[N]; int main(){ios::sync_with…

在Windows 11中查找计算机规格,主要有两种方法

了解如何在Windows 11上查找计算机规格有助于实现各种目的&#xff0c;从故障排除问题到了解软件兼容性和系统功能。它还可以在帮助你决定要升级计算机的哪些部分方面发挥关键作用。 值得庆幸的是&#xff0c;在Windows 11上查找计算机的硬件规格是一个简单的过程&#xff0c;…

探秘MSSQL存储过程:功能、用法及实战案例

在现代软件开发中&#xff0c;高效地操作数据库是至关重要的。而MSSQL&#xff08;Microsoft SQL Server&#xff09;作为一款强大的关系型数据库管理系统&#xff0c;为我们提供了丰富的功能和工具来处理数据。其中&#xff0c;MSSQL存储过程是一项强大而又常用的功能&#xf…

Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍 为什么需要channel&#xff1f;前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但不完美 1)主线程在等待所有goroutine全部完成的时间很难确定&#xff0c;我们这里设置10秒&#xff0c;仅仅是估算。 2)如果主线程休眠时间长了&#xff0c…

CleanMyMac X2024最新专业苹果电脑mac系统垃圾清理软件

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

【基于大数据的人肥胖程度预测分析与可控策略】

基于大数据的人肥胖程度预测分析与可控策略 前言数据获取与清洗数据挖掘与分类建模1. K-means聚类2. 层次聚类3. DBSCAN4. 分类建模 数据可视化模型肥胖程度预测分析与可控策略结语 前言 随着现代生活方式的改变&#xff0c;肥胖问题逐渐成为全球性的健康挑战。为了更好地理解…

【React Hooks】useReducer()

useReducer 的三个参数是可选的&#xff0c;默认就是initialState&#xff0c;如果在调用的时候传递第三个参数那么他就会改变为你传递的参数&#xff0c;实际开发不建议这样写。会增加代码的不可读性。 使用方法&#xff1a; 必须将 useReducer 的第一个参数&#xff08;函数…

[仅供学习,禁止用于违法]编写一个程序来手动设置Windows的全局代理开或关,实现对所有网络请求拦截和数据包捕获(抓包或VPN的应用)

文章目录 介绍一、实现原理二、通过注册表设置代理2.1 开启代理2.2 关闭代理2.3 添加代理地址2.4 删除代理设置信息 三、代码实战3.1 程序控制代理操作控制3.1.1 开启全局代理3.1.2 添加代理地址3.1.3 关闭代理开关3.1.4 删除代理信息 3.2 拦截所有请求 介绍 有一天突发奇想&am…

java--Math、System、Runtime

1.Math 代表数字&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法。 2.Math类提供的常见方法 3.System System代表程序所在的系统&#xff0c;也是一个工具类。 4.System类提供的常见方法 5.时间毫秒值 值的是从1970年1月1日 00:00:00走到…

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

CDN 内容分发网络

CDN常见问题 什么是 CDN &#xff1f; CDN 全称是 Content Delivery Network/Content Distribution Network&#xff0c;翻译过的意思是 内容分发网络 。 我们可以将内容分发网络拆开来看&#xff1a; 内容&#xff1a;指的是静态资源比如图片、视频、文档、JS、CSS、HTML。…

12.9_黑马数据结构与算法笔记Java

目录 057 多路递归 e03 杨辉三角2 thinking&#xff1a;二维数组的动态初始化&#xff1f; 057 多路递归 e03 杨辉三角3 058 链表 e01 反转单向链表1 058 链表 e01 反转单向链表2 058 链表 e01 反转单向链表3 递归 058 链表 e01 反转单向链表4 为什么是returnn1呢&…

K8S学习指南(4)-minikube的使用

文章目录 简介安装 Minikube启动 Minikube 集群基本概念创建和管理资源1. 创建 Pod2. 创建 Deployment3. 创建 Service 监视和调试1. 查看集群状态2. 查看集群信息3. 访问 Kubernetes Dashboard4. 使用 kubectl 命令 清理资源1. 删除 Pod2. 删除 Deployment3. 删除 Service4. 停…

【Flink on k8s】- 5 - 简要介绍 Flink

目录 1、了解流计算框架 1.1 分代 1.2 流计算框架对比 2、Flink 的应用场景 2.1 Data anal

VUE语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据&#xff0c;当我们通过reactive定义了一个对象或者数组数据的时候&#xff0c;如果我们只希望这个对象或者数组中指定的数据响应&#xff0c;其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

Oracle高可用一家老小全在这里

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…