Python设计模式之命令模式原理与用法实例分析

Python设计模式之命令模式原理与用法实例分析

什么是命令模式

命令模式是一种行为型设计模式,它允许将请求封装成一个对象,从而使您可以将不同的请求、队列或日志请求参数化,支持可撤销操作。

在命令模式中,有四个基本角色:

  1. Command(命令):抽象命令类,声明了执行操作的接口。
  2. ConcreteCommand(具体命令):将一个接收者对象和一个动作绑定在一起,实现了执行操作的接口。
  3. Receiver(接收者):知道如何实施与执行一个请求相关的操作。
  4. Invoker(调用者):调用命令执行请求。

命令模式示例

示例1:智能家居控制器

现在,我们来使用命令模式编写一个智能家居控制器。

定义接收者:具体动作

from abc import ABC, abstractmethod

class Light:
    def on(self):
        print("The light is on")

    def off(self):
        print("The light is off")

定义命令接口

class Command(ABC):
    @abstractmethod
    def execute(self):
        pass

定义具体命令

class LightOnCommand(Command):
    def __init__(self, light):
        self._light = light

    def execute(self):
        self._light.on()

class LightOffCommand(Command):
    def __init__(self, light):
        self._light = light

    def execute(self):
        self._light.off()

实现调用者

class RemoteControl:
    def __init__(self):
        self._on_commands = []
        self._off_commands = []

    def set_command(self, command, slot):
        if slot < 0 or slot > 1:
            return
        if isinstance(command, LightOnCommand):
            self._on_commands.insert(slot, command)
        elif isinstance(command, LightOffCommand):
            self._off_commands.insert(slot, command)

    def on_button_pressed(self, slot):
        self._on_commands[slot].execute()

    def off_button_pressed(self, slot):
        self._off_commands[slot].execute()

客户端代码

if __name__ == "__main__":
    living_room_light = Light()

    living_room_light_on = LightOnCommand(living_room_light)
    living_room_light_off = LightOffCommand(living_room_light)

    remote_control = RemoteControl()
    remote_control.set_command(living_room_light_on, 0)
    remote_control.set_command(living_room_light_off, 1)

    remote_control.on_button_pressed(0)
    remote_control.off_button_pressed(1)

    remote_control.off_button_pressed(2)  # 该操作将不会执行

示例2:财务系统日志记录

现在,我们来看看一个更加实际的例子。假设我们的公司有一个财务系统,我们使用命令模式来记录正常操作和异常操作的日志。

定义接收者

class FinanceSystem:
    def pay(self, amount):
        print(f"Paid {amount}")

    def refund(self, amount):
        print(f"Refunded {amount}")

定义命令接口

class FinanceCommand(ABC):
    @abstractmethod
    def execute(self):
        pass

定义具体命令

import logging

class PayCommand(FinanceCommand):
    def __init__(self, finance_system, amount):
        self._finance_system = finance_system
        self._amount = amount

    def execute(self):
        try:
            self._finance_system.pay(self._amount)
            logging.info(f"Paid {self._amount}")
        except Exception as e:
            logging.error(str(e))

class RefundCommand(FinanceCommand):
    def __init__(self, finance_system, amount):
        self._finance_system = finance_system
        self._amount = amount

    def execute(self):
        try:
            self._finance_system.refund(self._amount)
            logging.info(f"Refunded {self._amount}")
        except Exception as e:
            logging.error(str(e))

实现调用者

class FinanceInvoker:
    def __init__(self, finance_system):
        self._finance_system = finance_system
        self._commands = []

    def add_command(self, command):
        self._commands.append(command)

    def execute(self):
        for command in self._commands:
            command.execute()

客户端代码

if __name__ == "__main__":
    finance_system = FinanceSystem()

    logging.basicConfig(filename='finance_system.log', level=logging.INFO)

    pay_command = PayCommand(finance_system, 100)
    refund_command = RefundCommand(finance_system, 50)

    finance_invoker = FinanceInvoker(finance_system)
    finance_invoker.add_command(pay_command)
    finance_invoker.add_command(refund_command)

    finance_invoker.execute()

在示例2中,我们使用了Python内置的logging库来记录日志。当捕获到异常时,我们会将错误信息记录下来。通过记录日志,我们可以更好地追踪和debug自己的代码。

结论

在以上的示例中,我们可以看到命令模式的强大。命令模式可以很容易地扩展,而不需要修改现有的代码,只需要添加新的命令即可。它还可以在系统中增加事务性操作,并支持可撤销操作。Python中,命令模式常被用于GUI程序、智能家居等方面的开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python设计模式之命令模式原理与用法实例分析 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • Python连接Mssql基础教程之Python库pymssql

    下面是Python连接Mssql基础教程之Python库pymssql的完整攻略。 什么是pymssql pymssql是一个用于连接Microsoft SQL Server数据库的Python开源库,提供了简单、轻量级、稳定、易于使用的API。可以在Python 2和Python 3环境中使用。 安装pymssql 使用pip安装pymssql: pip …

    python 2023年5月20日
    00
  • 使用Python的Tornado框架实现一个简单的WebQQ机器人

    下面我会详细讲解使用Python的Tornado框架实现一个简单的WebQQ机器人的完整攻略。 1. 准备工作 首先,你需要申请QQ机器人账号、安装Python语言环境及Tornado框架。 2. 获取QQ机器人的cookie和ptwebqq 在Python代码中通过模拟浏览器登录QQ账号,然后从登录后的cookie和ptwebqq中获取QQ机器人的cook…

    python 2023年5月23日
    00
  • python正则表达式 匹配反斜杠的操作方法

    Python正则表达式匹配反斜杠的操作方法 在Python中,反斜杠(\)是一个特殊字符,用于转义其他字符。在正则表达式中,反斜杠也是一个特殊字符,用于转义其他正则表达式字符。因此,如果我们需要匹配反斜杠本身,就需要使用特殊的操作方法。本攻略将详细讲解Python中正则表达式匹配反斜杠的操作方法,并提供两个示例说明。 匹配反斜杠的操作方法 在正则表达式中,反…

    python 2023年5月14日
    00
  • Python with用法:自动关闭文件进程

    Python with用法:自动关闭文件进程 在 Python 中,使用文件进行读写操作是十分常见的操作行为。通常我们需要手动打开文件、读取文件、写入数据并关闭文件进程。在这个过程中,如果程序出现异常或者在读写文件等待过程中被打断,导致文件未能完全正常关闭,这样就容易出现文件泄露或者文件损坏等问题。 使用 with 语句可以有效解决这类问题,with 语句可…

    python 2023年5月19日
    00
  • Python如何实现自动发送邮件

    下面我为你详细讲解一下 Python 如何实现自动发送邮件的完整攻略。 准备工作 在 Python 中发送邮件需要使用 smtplib 模块和 email 模块。因此,我们需要先安装好这两个模块。可以在命令行中使用以下命令进行安装: pip install smtplib pip install email 实现步骤 第一步:导入模块 在代码文件中导入 sm…

    python 2023年5月19日
    00
  • 导致python中import错误的原因是什么

    导致Python中import错误的原因是什么 在Python中,import语句用于导入模块或包。但是,有时候会遇import错误,导致程序无法正常行。本文将介绍一些常见的导致import错误的原因。 原因1:块或包不存在 如果您尝试导入不存在的模块或包,将会导致import错误。解决方法是确保您导入的模块或包存在。您可以使用以下命令检查模块或包是否存在:…

    python 2023年5月13日
    00
  • Python生成器(Generator)详解

    Python生成器(Generator)详解 生成器的定义 Python中的生成器(Generator)是一种特殊的迭代器,可以通过函数来创建。生成器函数返回一个内部状态,这个状态可以在函数每次被调用时更新,因此生成器可以暂停和恢复执行。这种行为通常称为协程。 生成器的实现 Python生成器可以通过使用yield语句进行实现。在Python中,yield语…

    python 2023年5月13日
    00
  • 13个你可能未使用过的Python特性分享

    13个你可能未使用过的Python特性分享 在Python语言中,拥有许多许多强大且有用的特性,很多人很少使用或依旧不了解。本篇文章将分享13个你可能未使用过的Python特性,这些特性可能会极大地提升你的编码效率,让你的代码更加优雅。 1. 列表推导式 列表推导式是一种用于创建列表的快速方式,它可以让你使用更少的代码创建一个新的列表。它的语法非常简单,用一…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部