Python 设计模式中命令模式

 更新时间:2022年02月15日 08:45:54   作者:范桂飓  
这篇文章主要介绍了Python 设计模式中的命令模式,命令模式的目的是解耦调用操作的对象和提供实现的对象,下文介绍具有一定参考价值,需要的小伙伴可以参考一下

1.命令模式

命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者)。

命令模式的思路是在调用者和接收者之间插入一个命令类(Command),该命令类定义了一个 execute 接口,并且该接口实际上是调用了接收者中的具体方法来执行具体命令,以此可以通过扩展命令子类来扩展多个不同的接收者。

这样调用此命令的调用者就和命令接收者之间解耦了。

优势:

  • 封装性好,每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。
  • 扩展性好,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装。
  • 复用性好,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用。

2.应用场景

菜单驱动文本编辑器:调用者是菜单,接收者是被编辑的文档。

3.代码示例

实体角色:

抽象的命令基类(Command):命令的抽象类,定义命令的接口,可以理解为一个基类。
具体的命令实现类(ConcreteCommand):命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
命令接受者(Receiver):真正接收并执行具体命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
命令调用者(Invoker):对命令进行调用,然后将命令发送给接收者。通常会持有命令对象,可以持有很多的命令对象,相当于使用命令对象的入口。
命令装配者(Client):客户端会创建具体的命令对象,组装命令对象和接收者。

class Command:
    """声明命令模式接口"""
    def __init__(self, obj):
        self.obj = obj

    def execute(self):
        pass


class ConcreteCommand(Command):
    """实现命令模式接口"""
    def execute(self):
        self.obj.run()


class Invoker:
    """接受命令并执行命令的接口"""
    def __init__(self):
        self._commands = []

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

    def remove_command(self, cmd):
        self._commands.remove(cmd)

    def run_command(self):
        for cmd in self._commands:
            cmd.execute()


class Receiver:
    """具体动作"""
    def __init__(self, word):
        self.word = word

    def run(self):
        print(self.word)


def client():
    """装配者"""
    test = Invoker()
    cmd1 = ConcreteCommand(Receiver('命令一'))
    test.add_command(cmd1)
    cmd2 = ConcreteCommand(Receiver('命令二'))
    test.add_command(cmd2)
    cmd3 = ConcreteCommand(Receiver('命令三'))
    test.add_command(cmd3)
    test.run_command()


if __name__ == '__main__':
    client()

到此这篇关于Python 设计模式中命令模式的文章就介绍到这了,更多相关Python 设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中快速进行多个字符替换的方法小结

    python中快速进行多个字符替换的方法小结

    最近在用python给自己的seo工作提高效率和节省时间,发现python真的很不错,可以完成很多事情。多个字符替换是大家可能都会遇到的一个问题,昨天在工作中就碰到了这么一个问题,所以想着记录一下解决方案及其过程,方便以后参考。下面来一起看看吧。
    2016-12-12
  • Python基础学习之模块的安装和卸载

    Python基础学习之模块的安装和卸载

    其实现在还是有很多刚开始学习的小伙伴,会遇到模块不会安装的情况,或者一遇到报错就懵了,这样就很耽误我们的学习进度。所以,今天我们就来了解一下Python几种安装模块的方法吧
    2022-09-09
  • 如何利用Python和matplotlib更改纵横坐标刻度颜色

    如何利用Python和matplotlib更改纵横坐标刻度颜色

    对于图表来说最简单的莫过于作出一个单一函数的图像,下面这篇文章主要给大家介绍了关于如何利用Python和matplotlib更改纵横坐标刻度颜色的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Python实现简单遗传算法(SGA)

    Python实现简单遗传算法(SGA)

    这篇文章主要为大家详细介绍了Python实现简单遗传算法SGA,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python中常见的三种字符串格式化输出方法小结

    Python中常见的三种字符串格式化输出方法小结

    字符串格式化是编程中一个常见的需求,它可以们将不同类型的数据插入到字符串中,在 Python 中,有多种方法可以执行字符串格式化,本文为大家介绍了常见的三种方法,希望对大家有所帮助
    2024-02-02
  • Flask框架配置与调试操作示例

    Flask框架配置与调试操作示例

    这篇文章主要介绍了Flask框架配置与调试操作,结合实例形式简单分析了flask框架配置管理与调试模式简单操作技巧,需要的朋友可以参考下
    2018-07-07
  • Python实现京东抢秒杀功能

    Python实现京东抢秒杀功能

    这篇文章主要介绍了Python实现京东抢秒杀功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 基于Python 的进程管理工具supervisor使用指南

    基于Python 的进程管理工具supervisor使用指南

    Supervisor 是基于 Python 的进程管理工具,可以轻松管理一些需要以守护进程方式执行的程序,也就是后台任务,例如用来启动和管理基于 Tornado 写的 Web 程序。
    2016-09-09
  • python将字符串转换成json的方法小结

    python将字符串转换成json的方法小结

    这篇文章主要介绍了python将字符串转换成json的方法小结,通过实例代码给大家介绍将字符串型的数据转换成dict类型遇到的问题,需要的朋友可以参考下
    2019-07-07
  • 深入理解最新Python中的Match Case

    深入理解最新Python中的Match Case

    最近发布的 Python 3.10 的所有主要新特性中最重要就是 Match-Case 语法,本文将带你深入探讨,会发现 Match-Case 其实没有那么简单
    2021-11-11

最新评论