设计模式系列之命令模式

定义

命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

模式结构

命令模式类图
client 负责创建一个ConcreteCommand,并设置接受者
ConcreteCommand 定义了动作和接受者之间的绑定关系
Receiver 接受者,action实现接受者自己的动作
Command 命令对象接口,实现该接口只需要实现 execute() 和 undo()
Invoker 调用者持有命令对象,只要调用命令对象的 execute() 方法即可将请求执行

模式分析

命令模式的本质是将请求进行封装,将命令的发出责任和命令的执行责任分开。
请求者发出请求,要求执行一个动作,接受者收到请求,并执行一个动作。
请求者并不知道接受者是谁,也不知道接受者如何收到请求并执行请求。

代码实现
class Command(object)

    def __init__(self, receiver):
        self.receiver = receiver
  
    def execute(self):
        raise NotImplementedError

    def undo(self):
        raise NotImplementedError


class ConcreteCommand(Command):

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

    def undo(self):
        self.receiver.reverse()


class Receiver(object):
    
    def action(self):
        raise NotImplementedError

    def reverse(self):
        raise NotImplementedError


class ConcreteReceiver(Receiver):

    def action(self):
        print('action concreate receiver.')

    def reverse(self):
        print('action reverse')


class Invoker(object):
    undo_command = None

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

    def execute_command(self):
        self.command.execute()
        self.undo_command = self.command

    def undo(self):
        self.undo_command.undo()


def main():
    receiver = ConcreteReceiver()
    command = ConcreteCommand(receiver)
    invoker = Invoker()
    invoker.set_command(command)
    invoker.execute_command()
    invoker.undo()
适用性
  1. 系统需要将请求调用者和请求接受者之间解耦
  2. 系统需要在不同的时间指定请求,将请求排队和执行请求
  3. 系统需要支持命令的撤销操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值