(七)Python 命令模式

news2024/11/19 1:29:36

文章目录

  • 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 = rootdir
		self.src = src
	def 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 code
	wizard = Wizard('python3.5.gzip','/usr/bin/')
	## Users chooses to installPythononly
	wizard.preferences({'python':True})
	wizard.preferences({'java':False})
	wizard.execute()

4 命令模式的优点和缺点

4.1 优点

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

4.2 缺点

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1298451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Com通信】Com模块详细介绍

目录 前言 1. Com模块功能介绍 2.关键概念理解 3.功能详细设计 3.1 Introduction 3.2 General Functionality 3.2.1 AUTOSAR COM basis 3.2.2 Signal Values 3.2.3 Endianness Conversion and Sign Extension 3.2.4 Filtering 3.2.5 Signal Gateway 3.3 Normal Ope…

Jenkins入门手册

目录 第一章、Jenkins是什么? 1、Jenkins的由来 1.1 、Jenkins 的目标 第二章、Jenkins安装与配置 2、Jenkins 安装 3、Jenkins 配置 3.1 系统管理 3.1.1 、提示信息 3.1.1.1 、Utf-8 编码 3.1.1.2 、新的版本 3.1.1.3、安全设置 3.1.2、系统设置 3…

Go语言深度优先搜索(DFS)

Go 语言代码段实现了深度优先搜索(DFS)算法,该算法用于遍历图数据结构。以下是代码的主要要点和执行流程的总结: 深度优先搜索函数 (DFS): 接收图的邻接表 (map[int][]int)、访问记录 (map[int]bool) 和当前节点作为参数。将当前…

go sort.Search()

函数 func Search(n int, f func(int) bool) int {} 函数作用 通过二分法查找,找到已经排序好的数组[0,n)中第一个使f为true的索引,如果没有找到返回n 为什么要用二分查找? 因为二分查找相比普通依次遍历而言,速度能有巨幅提升…

延时消息+递归导致重复消费爆炸问题

背景 公司所用消息队列为RoucketMQ,版本为4.x。最近公司有业务需要,将某个处理延迟到第二天的白天再进行。由于4.x版本队列,默认延时时间是按等级来延时的,默认有18个等级,如下图: 默认的延时等级&#xff…

我对迁移学习的一点理解(系列2)

文章目录 我对迁移学习的一点理解 我对迁移学习的一点理解 源域和目标域是相对的概念,指的是在迁移学习任务中涉及到的两个不同的数据集或领域。 源域(Source Domain)通常指的是已经进行过训练和学习的数据集,它被用来提取特征、…

盒马补贴量价-2021KDD

概述: 电商商品定价三个关键问题: 在只有观测数据的时候,怎么构建价格弹性,现在来看这就是一个反事实推断的问题,不仅是如何做的问题,还有如何评估的问题。长周期的规划决策问题怎么建模 & 求解&#…

基于状态机的单片机编程

前言 在设计锂离子电池充电器时,对于以前的根据系统状态进行判断,置标志位的方法,会显得程序臃肿,且架构混乱,变量交错复杂,移植困难。 所以结合实际项目,给出了一种基于状态机的编程方法。 …

线程上下文切换

线程上下文切换 巧妙地利用了时间片轮转的方式, CPU 给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务,任务的状态保存及再加载, 这段过程就叫做上下文切换。时间片轮转的方式…

对String类的操作 (超细节+演示)

[本节目标] 1.认识String类 2.了解String类的基本用法 3.熟练掌握String类的常见操作 4.认识字符串常量池 5.认识StringBuffer和StringBuilder 1.String类的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针&…

差异计算基础知识 - 了解期末业务操作、WIP 和差异

原文地址:Basics of variance calculation-Understanding Period End activities, WIP and Variances | SAP Blogs 大家好, 这是我在成本核算方面的第六份文件,旨在解释期末的差异计算和相关活动。 我将引导您完成期末活动和差异计算。在本文…

Spring Cloud Gateway 网关的基础使用

1. 什么是网关?网关有什么用? 在微服务架构中,网关就是一个提供统一访问地址的组件,它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发,将外部请求引到对应的微服务实例上。同时提供身份认证、授权、…

前后端数据传输格式(下)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 上篇主要复习了HTTP以及…

解释AI决策,这10个强大的 Python 库记得收藏!

本文整理了10个常用于可解释AI的Python库,方便我们更好的理解AI模型的决策。 什么是XAI? XAI(Explainable AI)的目标是为模型的行为和决策提供合理的解释,这有助于增加信任、提供问责制和模型决策的透明度。XAI 不仅…

鸿蒙生态开发就业前景到底好不好

鸿蒙生态开发是指基于华为自主研发的操作系统鸿蒙(HarmonyOS)进行应用程序开发和生态建设。目前,鸿蒙生态开发的前景非常好,原因如下:做鸿蒙应用开发到底学习些啥? (qq.com) 1:政府支持&#x…

高德地图vue实现自定义标点热力图效果(缩放时展示不同数据)

高德地图插件引入省略。。。样式和vue基础组件省略。。。 如果每个标点没有数值,则可以用点聚合来实现功能下面例子,每个标点会有按市统计的数值,而且缩放一定程度时,需要展示按省统计的标点,因此需要自定义标点样式和…

Ubuntu中编译出Windows的可执行程序(.exe)

1、前言 在嵌入式开发中,交叉编译是很常见的情况,如果你把Windows电脑也看做一块高性能的开发板,那在Ubuntu中编译出Windows上运行的可执行程序也是很好理解的行为。 2、安装mingw64环境 sudo apt-get install mingw-w64 3、测试编译链是否安…

特权FPGA 学习笔记

存储器可用于异步时钟域的信号处理,双口RAM多用于交互式数据,FIFO多用于单向数据传输;以task的方式封装testbench子程序,以提高复用程度;模板中,vho是vhdl模板,veo是verilog模板;run…

第七届中老越三国丢包狂欢节暨2023年中老越三国(普洱)边境商品交易会新闻发布会在昆明召开

12月8日,第七届中老越三国丢包狂欢节暨2023年中老越三国(普洱)边境商品交易会新闻发布会在昆明召开。据悉,本届丢包节暨边交会将于2023年12月22日至26日在普洱市江城哈尼族彝族自治县举办。 发布会现场 中老越三国丢包狂欢节自200…

解决 php 连接mysql数据库时报错:Fatal error: Class ‘mysqli’ not found in问题

在使用php对mysql进行连接的过程中,出现了Fatal error: Uncaught Error: Class "mysqli" not found in的问题 解决方案 这个错误通常表示您的PHP代码中缺少MySQL扩展或者没有启用MySQL扩展。 我们首先确认一下PHP环境中已经安装了MySQL扩展。检查一下自己…