python设计模式-命令模式

命令模式就是对命令的封装。所谓封装命令,就是将一系列操作封装到命令类中,并且命令类只需要对外公开一个执行方法 execute,调用此命令的对象只需要执行命令的 execute方法就可以完成所有的操作。这样调用此命令的对象就和命令具体操作之间解耦了。更进一步,通过命令模式我们可以抽象出调用者,接收者和命令三个对象。调用者就是简单的调用命令,然后将命令发送给接收者,而接收者则接收并执行命令,执行命令的方式也是简单的调用命令的 execute方法就可以了。发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。下面让我们使用 Python 来实现命令模式。

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

import abc

class VmReceiver(object):
"""
    命令接收者,真正执行命令的地方
"""

    def start(self):
        print("虚拟机开始")

    def stop(self):
        print("虚拟机停止")

class Command(object):
"""
    命令抽象类
"""
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def execute(self):
"""
        命令对象对外只提供 execute 方法
"""
        pass

class StartVmCommand(Command):
"""
    开启虚拟机的命令
"""

    def __init__(self, recevier):
"""
        使用一个命令接收者初始化
"""
        self.recevier = recevier

    def execute(self):
"""
        真正执行命令的时候命令接收者开启虚拟机
"""
        self.recevier.start()

class StopVmCommand(Command):
"""
    停止虚拟机的命令
"""

    def __init__(self, recevier):
"""
        使用一个命令接收者初始化
"""
        self.recevier = recevier

    def execute(self):
"""
        真正执行命令的时候命令接收者关闭虚拟机
"""
        self.recevier.stop()

class ClientInvoker(object):
"""
    命令调用者
"""

    def __init__(self, command):
        self.command = command

    def do(self):
        self.command.execute()

if __name__ == '__main__':
    recevier = VmReceiver()
    start_command = StartVmCommand(recevier)
    # 命令调用者同时也是客户端,通过命令实例也执行真正的操作
    client = ClientInvoker(start_command)
    client.do()

    # 能告诉命令接收者执行不同的操作
    stop_command = StopVmCommand(recevier)
    client.command = stop_command
    client.do()

运行:

E:\实验楼学习\venv\Scripts\python.exe E:/实验楼学习/设计模式/command/command-1.py
虚拟机开始
虚拟机停止

Process finished with exit code 0

以上代码中,通过启动和停止 Linux 虚拟机的例子实现了命令模式。通过命令模式,使命令调用者 ClinetInvoker和命令接收者 VmRecevier之间解耦,前者不必知道后者具体是怎么操作虚拟机的,只需要通过 ClientInvoker.do()方法调用 Command.execute()方法能完成虚拟机的相关操作。

一般来说,命令模式的封装很好:每个命令都是封装的,对于客户端来说,无论需要什么功能,都需要调用相应的命令,而不需要确切知道命令是如何执行的。同时,该指挥模式的可扩展性很好。在命令模式下,操作一般封装在接收器类中,命令类对这些基本操作进行二次封装。在添加新命令时,命令类的编写一般不是从头开始的,有大量的接收器类要调用,也有大量的命令类要调用,代码可重用性很好。

[En]

Generally speaking, the encapsulation of the command mode is very good: each command is encapsulated, and for the client, it is necessary to invoke the corresponding command for whatever function is needed without knowing exactly how the command is executed. At the same time, the expansibility of the command mode is very good. In the command mode, the operation is generally encapsulated in the receiver class, and the command class encapsulates these basic operations for the second time. When adding new commands, the writing of the command class generally does not start from scratch, there are a large number of receiver classes to call, but also a large number of command classes to call, the code reusability is very good.

Original: https://www.cnblogs.com/mrwuzs/p/12026311.html
Author: mrwuzs
Title: python设计模式-命令模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7907/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部