python设计模式之命名模式

本文介绍命令模式的概念及其在Python中的应用实例。通过封装请求为对象,实现行为的解耦、记录、撤销等功能。适用于需要记录行为请求或将请求排队执行的场景。

python设计模式之命名模式

意图

  • 将请求封装成一个对象,从而使你可用不同的请求对客户端进行进行参数化,对请求排队或记录请求日志,以及支持可撤销的动作

解决的问题

  • 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适

适用性

  • 当需要对行为进行“记录、撤销/重做”等处理时
  • 系统需要将请求者和接收者解耦,使得调用者和接收者不直接交互
  • 系统需要在不同时间指定请求、请求排队和执行请求
  • 系统需要将一组操作组合在一起,即支持宏命令
  • 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。

例子

# -*- coding=utf-8 -*-
import os


class MoveFileCommand(object):
    def __init__(self, src, dest):
        self.src = src
        self.dest = dest

    def execute(self):
        self()

    def __call__(self):
        print('renaming {} to {}'.format(self.src, self.dest))
        os.rename(self.src, self.dest)

    def undo(self):
        print('renaming {} to {}'.format(self.dest, self.src))
        os.rename(self.dest, self.src)


if __name__ == "__main__":
    command_stack = list()

    command_stack.append(MoveFileCommand('foo.txt', 'bar.txt'))
    command_stack.append(MoveFileCommand('bar.txt', 'baz.txt'))

    for cmd in command_stack:
        cmd.execute()

    for cmd in reversed(command_stack):
        cmd.undo()

# 输出:
renaming foo.txt to bar.txt
renaming bar.txt to baz.txt
renaming baz.txt to bar.txt
renaming bar.txt to foo.txt
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值