python 命令模式 设计模式_Python 设计模式——命令模式

命令模式是一种行为设计模式。可以用来实现比如安装软件时的安装向导功能,通常安装向导会通过多个步骤根据用户的选择了解用户的偏好。安装向导首先启动一个名为 Command 的对象,用于存储在向导的多个步骤中用户指定的选项。当用户在最后一个步骤中点击完成按钮时,Command 对象就会运行 execute() 方法,该方法会考察所有存储的选项并完成相应的安装过程。

UML

命令模式通常包含以下术语:

Command 对象了解 Receiver 对象的情况,并能调用其方法

调用者(Invoker)方法的参数值存储在 Command 对象中

调用者知道如何执行命令

客户端(Client)用来创建 Command 对象并设置其接收者

命令模式的主要意图:

将请求封装为对象

可用不同的请求对客户端进行参数化

允许将请求保存在队列中

提供面向对象的回调

命令模式的适用场景:

根据需要执行的操作对对象进行参数化

将操作添加到队列并在不同地点执行请求

创建一个结构根据较小的操作来完成高级操作

代码示例

from abc import ABCMeta, abstractmethod

class Order(metaclass=ABCMeta):

@abstractmethod

def execute(self):

pass

class BuyStockOrder(Order):

def __init__(self, stock):

self.stock = stock

def execute(self):

self.stock.buy()

class SellStockOrder(Order):

def __init__(self, stock):

self.stock = stock

def execute(self):

self.stock.sell()

class Agent:

def __init__(self):

self.__orderQueue = []

def placeOrder(self, order):

self.__orderQueue.append(order)

order.execute()

class StockTrade:

def buy(self):

print("You will buy stocks")

def sell(self):

print("You will sell stocks")

if __name__ == '__main__':

stock = StockTrade()

buyStock = BuyStockOrder(stock)

sellStock = SellStockOrder(stock)

agent = Agent()

agent.placeOrder(buyStock)

agent.placeOrder(sellStock)

# => You will buy stocks

# => You will sell stocks

Order 类 -> Command 对象

BuyStockOrder 和 SellStockOrder 类 -> ConcreteCommand 对象,为交易系统定义适当的操作

StockTrade 类 -> Receiver 对象,定义了多个方法(动作)可以被 ConcreteCommand 调用以买入或卖出股票

Agent 类 -> Invoker 对象,作为客户端和 StockTrade 的中介,执行客户下达的订单

命令模式的优点:

将调用操作的类与知道如何执行该操作的类解耦

借助队列系统,可以创建一系列命令

添加新命令更加容易,无需更改现有代码

可以使用命令模式定义回滚系统

命令模式的缺点:

为了实现目标,需要大量的类和对象进行协作

每个单独的命令都是一个 ConcreteCommand 类,增加了实现和维护的成本

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

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

相关文章

神经网络基本原理简明教程-0-基本函数导数公式

基本函数导数公式 Copyright © Microsoft Corporation. All rights reserved. 适用于License版权许可 更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区 如何浏览本系列教程 由于里面包含了大量必要的数学公式,都是用LaTex格式编写…

mysql 硬负载_软负载均衡和硬负载均衡

一、负载均衡负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英文名称为 Load Balance,其意思就是分摊到多个操作单元…

微软发布人工智能教育与学习共建社区

步入2019,人工智能(Artificial Intelligence)的浪潮依然汹涌,各国对于AI人才的需求进一步加大:2月,美国总统特朗普签署行政命令,正式启动美国人工智能计划;加拿大正通过“全球技能战…

流量复制_快速体验之《gor+diffy实现线上流量复制到测试环境》

对于没有副作用的接口(重复发送不会产生两份数据、不会产生多余的监控统计等等),就可以用这种方式方便的做回归测试。 部署三个不接外部流量的服务,两份老版本、一份新版本,把生产环境的流量复制到 Diffy 上。 如果生产环境支持通过请求头之类…

顶级程序员的心得 –– Coders at Work

顶级程序员的心得 –– Coders at Work说明:这篇文章是我 2010 年的原创,但是发现 csdn 的版本把格式全部搞坏了,原文在这里 我2009年读了 “Coders at Work”, 这是作者对15 位顶级程序员的采访, 总共600页。 从采访的模式看&…

springboot 技术图谱_java后台(Springboot)开发知识图谱高频技术汇总-学习路线...

【原创】java后台(Springboot)开发知识图谱&&高频技术汇总1.引言:学习一个新的技术时,其实不在于跟着某个教程敲出了几行、几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开…

CSDN 原力 -- beta 测试中

更新 2022/8: 我们把原力等级和 “学习成就” 结合起来了。 请看: http://edu.csdn.net/me/softwareteacher 2022/7: 能用算法来判定一个 IT技术博客的质量么? 我们发布了博客质量分 API https://www.csdn.net/qc 大家可以去试一试。 2022/6&#xff1…

CSDN 统一标签设计 征求反馈

2021/4/21 更新: 这个设计文档签入了 repo:https://codechina.csdn.net/csdn/csdn-tags 如果你想增删改标签,请去提PR。 CSDN 在长期发展中,各个业务发展出各有特色的标签定义和用户体验,这个博客的目的是想把这些…

华为的涉外知识产权工程师_华为法务社招 | 岗位:高级知识产权工程师

//岗位一:高级知识产权工程师(网联车)//工作地点:上海岗位职责1、 负责智能车/电动车业务领域的专利包管理,为专利规划与分析,申请布局,授权应用等全流程提供专业服务;协助研发部门挖掘专利idea&#xff1b…

2021 部分团队的年终总结

博客主站: 这是 CSDN 的核心业务,持续投入,念念不忘,必有回响。 https://blog.csdn.net/weixin_42481955/article/details/121942860 社区:我们想让社区成为 IT 人的 ‘票圈’ 和 ‘公号’, 目前只是迈出…

gtx1660是什么级别的_GTX1660Ti到底属于什么系列?Nvidia一句话定性了

原标题:GTX1660Ti到底属于什么系列?Nvidia一句话定性了目前大家已经能够从不少渠道买到Nvidia最新的GTX 1660 Ti显卡了,娱乐大师将近20万的分数可以说确实挺不错,而基于图灵构架的它在玩游戏上面也丝毫不弱于GTX 1070,…

博客写作在App

测试在App 上写作博客。 今天和公司的小伙伴去山里总结工作讨论新年的计划。 1)抓住历史给开发者的机遇 2)聚焦,做出非常高质量的产品,体验和运营。做全行业第一。做最好的开发者内容和生态平台。 3)基础要打牢&#x…

mysql 检查_检查MySQL的健康状况

MySQL提供了大量的变量、参数以用于性能及健康状态检查。现在让我们一起看看那些比较重要的变量、参数。1MySQL是否可用?这当然是首先要做的,如果你的MySQL服务都没在跑了,其它监控从何谈起?我们可以使用如下几条命令来查看当前My…

技能树发布的新闻稿

技能树发布的新闻稿 (这是2021年7月构思的产品) 按照 “working backwards” 和 以终为始 的思路,先写一个新闻稿,和关于这个产品的问答。 描述我们的产品最终能产生什么效果和影响,再回过头来推动设计和技术工作&…

mysql slave同步_Slave_SQL_Running: No mysql同步故障解决方法

Slave_SQL_Running: No mysql同步故障解决今天检查数据库发现一台MySQL Slave未和主机同步,查看Slave状态:mysql> show slave status\GSlave_IO_Running: YesSlave_SQL_Running: NoLast_Errno: 1062....Seconds_Behind_Master:NULL原因:1.…

php mysql 反斜杠_MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义(转)

问题描述:mysql中带有反斜杠的内容入库后,发现反斜杠无故失踪了(俗话说被吃掉了)例:插入insert into tb(url) values(absc\eeee); 结果数据库里的内容是:absceeee(反斜杠没了呢)这么详细了相信大家都搞清楚问题了吧,下…

C笔记 -- 一个为 IT人士打造的笔记工具

立即下载: https://plugin.csdn.net/chrome-index-help C笔记 讨论社区:https://bbs.csdn.net/forums/placard?category0&typeId23466 设想我们有这样的工具,你会使用么? 能帮助你学习么? 2022 年 9 月 28 日更…

2022年上半年部分团队的总结

CSDN 是中国 IT 人士学习,成长,成功的平台。 平台有很多小团队,不断地开发出很多小功能,运营活动,那么,半年过去了,大家做得怎么样呢? 我们看看今年上半年各团队的总结:…

mysql 安全删除_mysql的binlog安全删除的一种方法

指定过期天数(expire_logs_days) ---适用于单机版mysql!该参数为全局可动态调整参数,默认值为0,即关闭,取值范围0-99。1.3.1 参数的查看:mysql> show variables like expire_logs_days;-------------------------| …

参加 CSDN 一线客服工作的经历

在工位上得到的用户反馈 我加入 CSDN 后,先是远程工作,然后几经周折,终于来到 CSDN 北京总部的办公室,公司的同事为了让我尽快了解用户的心声,把我的工位安排在这个 《用户心声》 大屏幕的下方,我经常可以…