Python:设计模式之命令模式

简介: Python:设计模式之命令模式

命令模式

命令模式属于行为型模式

行为型模式侧重于对象的响应性,利用对象之间的交互实现更强大的功能

其中对象用于封装在完成一项操作或在触发一个事件时所需的全部信息:

1、方法名称

2、拥有方法的对象

3、方法参数的值


命令模式术语

Command: 声明执行操作的接口

ConcreteCommand:将一个Receiver对象和一个操作绑定在一起

Receiver:创建ConcreteCommand对象并设定其接收者

Invoker:要求该ConcreteCommand执行这个请求

Client:知道如何实施与执行一个请求相关的操作


执行流程:

客户端请求执行命令,

调用者接受命令,封装它并将其放置到队列中,

ConcreteCommand类根据所请求的命令来知道接收者执行特定的动作


命令模式主要意图

1、将请求封装为对象

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

3、允许将请求保存在队列中

4、提供面向对象的回调


命令模式适用场景

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

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

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


命令模式应用

1、重做或回滚操作

2、异步任务执行


命令模式的优点

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

2、提供队列系统后,可以创建一系列命令

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

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


命令模式的缺点

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

2、每个单独的命令都是一个ConcreteCommand类,从而增加了需要实现和维护的类的数量


代码实例:

# -*- coding: utf-8 -*-

from abc import ABCMeta, abstractmethod


# 提供接口Command
class Order(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass


# 具体命令 ConcreteCommand
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()


# Receiver对象
class StockTrade(object):
    def buy(self):
        print("buy stock")

    def sell(self):
        print("sell stock")


# 调用者Agent,中介
class Broker(object):
    def __init__(self):
        self.__order_list = []  # 订单队列

    def add_order(self, order):
        self.__order_list.append(order)

    def place_order(self):
        for order in self.__order_list:
            order.execute()

        self.__order_list.clear()


if __name__ == '__main__':
    # client
    stock = StockTrade()
    buy_stock = BuyStockOrder(stock)
    sell_stock = SellStockOrder(stock)

    # invoker
    broker = Broker()
    broker.add_order(buy_stock)
    broker.add_order(sell_stock)

    broker.place_order()
"""
buy stock
sell stock
"""

参考

Python设计模式第2版》第七章 命令模式-封装调用

            </div>
目录
相关文章
|
Python Windows
Python 获取视频时长(附代码) | Python工具
Python 获取视频时长(附代码) | Python工具
Python 获取视频时长(附代码) | Python工具
|
存储 人工智能 数据可视化
Serverless Devs 介绍
## 开篇 2020年11月份,阿里云智能开源了Serverless 社区的开发者工具Serverless Devs(后简称S) 弥补了国内在Serverless 开发者工具的一个空白。通过高度灵活的配置设定,实现了无厂商锁定的支持;直观易懂的可视化配套也带来了极致的开发者使用体验。通过S你可以体验Serverless hello world 以及 构建生产级Serverless 应用 。你
1828 0
|
8月前
|
人工智能 JavaScript Serverless
从零开始开发 MCP Server
文章介绍了如何利用Serverless Devs CLI工具从零开发并一键部署MCP Server至阿里云函数计算(FC)。涵盖MCP协议背景、Serverless Devs工具简介、本地初始化与开发MCP Server步骤、通过SSE协议部署及测试MCP Server方法,以及三种客户端接入方式。读者可快速上手构建支持LLM扩展交互能力的智能体服务,并使用内置LLM的Inspector进行调试。文末还提供了更多资源和交流渠道。
2198 63
从零开始开发 MCP Server
|
11月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
1658 10
|
Java API
解决HTTP 400 Bad Request错误的方法
解决HTTP 400 Bad Request错误的方法
|
存储 编解码 Java
VOD
VOD 是阿里云视频点播服务(ApsaraVideo for VOD)的简称,是一种基于云计算和分布式存储技术的视频点播服务,提供了视频上传、转码、加密、存储、分发、播放等一系列功能,可以满足用户的多种视频应用需求。
1201 0
|
弹性计算 监控 负载均衡
阿里云函数计算(Function Compute):快速高效的事件驱动计算
阿里云函数计算(Function Compute)是一种事件驱动计算服务,能够在阿里云上运行代码,且只按照实际使用时间付费。它无需管理服务器和基础架构,并可以与其他阿里云产品以及第三方服务集成,为用户提供了快速、高效、低成本、弹性的云计算能力。
|
云安全 JSON 安全
最全!即学即会 Serverless Devs 基础入门(上)
在上篇《即学即会 Serverless | 如何解决 Serverless 应用开发部署的难题》中,我们阐述了工具链的重要性,那么本文将带领各位快速实现 Serverless Devs 入门。
|
Web App开发 数据采集 弹性计算
开发函数计算的正确姿势——轻松解决大依赖部署
本文介绍了 Fun 通过内置 NAS(阿里云文件存储)解决方案,可以一键帮用户创建、配置 NAS,并上传依赖到 NAS 上,解决函数计算对上传代码包大小的限制问题,而函数计算在运行时,可以自动从 NAS 读取到函数依赖。同时部署步骤简单明了,不需关心额外的配置,展现 Fun 工具对大依赖场景的顺滑体验。
x86,amd64,x86-64,x64区别
X86是一个指令集,是刚有个人电脑时候的什么8086,286,386的那个兼容的指令集。 “x86-64”,有时会简称为“x64”,是64位微处理器架构及其相应指令集的一种,也是Intel x86架构的延伸产品。
4501 0

热门文章

最新文章