命令模式是一种行为设计模式。可以用来实现比如安装软件时的安装向导功能,通常安装向导会通过多个步骤根据用户的选择了解用户的偏好。安装向导首先启动一个名为 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 类,增加了实现和维护的成本

python 命令模式 设计模式_Python 设计模式——命令模式相关推荐

  1. python文件合法模式组合_python设计模式之组合模式

    最开始接触组合设计模式是在大话设计模式这本书中的案例,讲的是让你设计一个公司的组织架构,一个总公司下有人力资源部门,IT部门, 财务部门,还有广州分公司.深圳分公司,在分公司下也有IT部门和财务部门, ...

  2. python 装饰器 继承_Python设计模式之装饰器模式

    装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...

  3. python采用单例模式游戏_Python实现Singleton模式的方式详解

    前言 使用python实现设计模式中的单例模式.单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的.本文将简要介绍一下python中实现单例模式的几种常见方式和原理.一方面可以加深对 ...

  4. python命令行参数传递_Python中 命令行参数传递 与 处理

    英文原文: http://www.artima.com/weblogs/viewpost.jsp?thread=4829 很多人会在 if __name__ == "__main__&quo ...

  5. python自动刷视频_python+adb命令实现自动刷视频脚本案例

    python小白第一次发博客,自己自学了一下写了一个demo,可能语法啥的不够标准,毕竟没有真正学过python 主要用到的是 import os #os包用于运行cmd命令 adb shell #这 ...

  6. python启动http服务_Python通过命令开启http.server服务器的方法

    前言 如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等.那么, Python 可能帮助你.使用Python可以完成一个简单的内建 ...

  7. python 异步 生产者 消费者_python 生产者消费者模式 - 刘江的python教程

    生产者消费者模式 阅读: 9884 评论:4 利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 什么是生产者和消费者? 在线程世界里, ...

  8. python做彩色字_python在命令行打印彩色文字

    [Python] 纯文本查看 复制代码#!/usr/bin/python # -*- coding: UTF-8 -*- import ctypes def echo(*o,c=7,sep=' ',e ...

  9. python实现手机通讯录_Python实现命令行通讯录

    1.实现目标 编写一个命令行通讯录程序,可以添加.查询.删除通讯录好友及电话 2.实现方法 创建一个类来表示一个人的信息.使用字典存储每个人的对象,名字作为键. 使用pickle模块永久地把这些对象存 ...

最新文章

  1. 解决ajax.open方法失效问题
  2. 影响架构决策的非功能性需求
  3. 3.放弃CHAR吧,在铸成大错之前!
  4. 将键值对当作实参传进函数
  5. 分布式事务不理解?一次给你讲清楚!
  6. 杭电oj1176,2084java实现
  7. MONGODB 数据库文件读取的优化
  8. adonis.js mysql_Adonis.js——数据库基本操作
  9. Jenkins中切换devtoolset
  10. ElasticSearch安装过程中遇到的一些问题
  11. 2021年科技赋能中医药产业发展报告
  12. php框架--php框架的连贯查询实现原理
  13. git rm -r --cached_【Git】工作中99%能用到的git命令
  14. Java使用Swing实现五子棋。
  15. Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅
  16. 【君思智慧园区】智慧能源综合管理平台,智慧能源管理云平台建设方案!
  17. zip与rar的区别
  18. golang 将数据导入excel
  19. 程序员如何预防颈椎病?
  20. 招行首发芭比娃娃MP3

热门文章

  1. Python运算符与编码
  2. 数据结构-王道2017-第5章 图
  3. sql server select和set赋值的区别
  4. 数据结构C语言实现—队列操作
  5. 如何搭建一个 Data Guard 环境
  6. 3.6数对 (Python)
  7. jsp出现The import Xxx type is not resolved...
  8. java数组的四个要素_Java零基础系列教程04Java数组
  9. java中一个线程最小优先数_Java线程的优先级
  10. 船员能力评估计算机软件系统,船舶动力电力训练系统操作水平综合评估算法研究...