前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 设计模式—命令模式

Python 设计模式—命令模式

作者头像
Wu_Candy
发布2022-07-04 20:47:41
2080
发布2022-07-04 20:47:41
举报
文章被收录于专栏:无量测试之道
这是无量测试之道的第197篇原创

今日分享主题:Python 设计模式之命令模式。

定义 命令模式是一种行为设计模式,用于封装触发事件(完成任何一个操作)所包含的所有信息。一般有方法名称,拥有方法对象,方法参数等。

命令模式就是对命令的封装。所谓封装命令,就是将一系列操作封装到命令类中,并且命令类只需要对外公开一个执行方法 execute,调用此命令的对象只需要执行命令的 execute 方法就可以完成所有的操作。这样调用此命令的对象就和命令具体操作之间解耦了。

通过命令模式我们可以抽象出调用者,接收者和命令三个对象。调用者就是简单的调用命令,然后将命令发送给接收者,而接收者则接收并执行命令,执行命令的方式也是简单的调用命令的 execute 方法就可以了。发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。

结构组成

  • Command: 定义命令的接口类,声明要执行的抽象方法,可以理解为一个基类。
  • ConcreteCommand_*: 命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
  • Invoker: 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象,相当于使用命令对象的入口。
  • Proxy: 代理的调用者

Python 代码实现

代码语言:javascript
复制
from abc import abstractmethod,ABC
class Command(ABC):
    """声明抽象类,定义抽象方法"""
    @abstractmethod
    def execute(self):
        pass

class ConcreteCommand_start(Command):
    """实现抽象类的抽象方法"""
    def __init__(self,obj1):
        self.obj1=obj1

    def execute(self):
        self.obj1.start()


class ConcreteCommand_show(Command):
    """实现抽象类的抽象方法"""
    def __init__(self,obj2):
        self.obj2=obj2

    def execute(self):
        self.obj2.show()

class Invoker:
    """接受命令并执行命令的类"""
    def start(self):
        print("command is starting...")

    def show(self):
        print("command is showing...")

class Proxy:
    """定义一个代理类"""
    def __init__(self):
       self.__queue=[]

    #命令执行方法
    def execute_cmd(self,cmd):
       self.__queue.append(cmd)
       cmd.execute()

if __name__ == '__main__':
    #实例化可执行命令的类对象
    test=Invoker()
    cmd1=ConcreteCommand_start(test)
    cmd2=ConcreteCommand_show(test)
    #实例化代理者类对象
    proxy=Proxy()
    proxy.execute_cmd(cmd1)
    proxy.execute_cmd(cmd2)

输出结果为:

代码语言:javascript
复制
command is starting...
command is showing...

总结 命令行模式的优势如下:

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

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 这是无量测试之道的第197篇原创
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档