python设计模式14-命令模式

1. 命令模式(Command)介绍

UML类图

在这里插入图片描述

角色介绍

  • Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
  • ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
  • Client类:最终的客户端调用类。
  • Invoker类:调用者,负责调用命令。
  • Receiver类:接收者,负责接收命令并且执行命令。

2. 示例

  • 顾名思义,命令模式就是对命令的封装。所谓对命令的封装,说白了,无非就是把一系列的操作写到一个方法中,然后供客户端调用就行了,反映到类图上,只需要一个ConcreteCommand类和Client类就可以完成对命令的封装,即使再进一步,为了增加灵活性,可以再增加一个Command类进行适当地抽象,这个调用者和接收者到底是什么作用呢?
  • 其实大家可以换一个角度去想:假如仅仅是简单地把一些操作封装起来作为一条命令供别人调用,怎么能称为一种模式呢?命令模式作为一种行为类模式,首先要做到低耦合,耦合度低了才能提高灵活性,而加入调用者和接收者两个角色的目的也正是为此。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''Command Pattern with Python Code
'''

from abc import abstractmethod, ABCMeta


# Command抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令
class Command(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass


# 接收者,负责接收命令并且执行命令
class Receiver(object):
    def do_enter(self):
        print("Receive a command")


# 调用者,负责调用命令
class Invoker(object):
    def set_command(self, command):
        self._command = command

    def action(self):
        self._command.execute()


# Command类的实现类
class ConcreteCommand(Command):
    def __init__(self, receiver):
        self._receiver = receiver

    def execute(self):
        self._receiver.do_enter()


# 最终的客户端调用类
class Client(object):
    def main(self, args=None):
        receiver = Receiver()
        command = ConcreteCommand(receiver)

        # 客户端直接执行具体命令方式
        command.execute()

        # 客户端通过调用者来执行命令
        invoker = Invoker()
        invoker.set_command(command)
        invoker.action()


if __name__ == "__main__":
    Client().main()

输出:

# ./Command.py 
Receive a command
Receive a command

参考:
https://yq.aliyun.com/articles/71070?spm=a2c4e.11155435.0.0.707a38daJdxBwQ
https://wiki.jikexueyuan.com/project/java-design-pattern/command-pattern.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值