STUNUM

面有萌色,胸有丘壑。心有猛虎,细嗅蔷薇。

嗨,我是王鑫 (@stunum),一名 Python 开发者。


Python web开发,后端以Django框架为主,前端使用Vue.js...

python设计模式之命令模式

命令模式

意义:

“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。

适用性:
  • 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(call back)函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。Command 模式是回调机制的一个面向对象的替代品。
  • 在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
  • 支持取消操作。Command的Excute 操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command 接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。
  • 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们。
  • 用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( transaction)的信息系统中很常见。一个事务封装了对数据的一组变动。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。
    举例:

    ``` class Command(object): #声明命令模式接口 def init(self, obj): self.obj = obj

    def execute(self): pass

class ConcreteCommand(Command): #实现命令模式接口 def execute(self): self.obj.run()

class Invoker(object): #接受命令并执行命令的接口 def init(self): self._commands = []

def add_command(self, cmd):
    self._commands.append(cmd)

def remove_command(self, cmd):
    self._commands.remove(cmd)

def run_command(self):
    for cmd in self._commands:
        cmd.execute()

class Receiver(object): #具体动作 def init(self, word): self.word = word

def run(self):
    print(self.word)

def client(): #装配者 test = Invoker() cmd1 = ConcreteCommand(Receiver(‘命令一’)) test.add_command(cmd1) cmd2 = ConcreteCommand(Receiver(‘命令二’)) test.add_command(cmd2) cmd3 = ConcreteCommand(Receiver(‘命令三’)) test.add_command(cmd3) test.run_command()

if name == ‘main’: client()


输出结果:

命令一 命令二 命令三 ```

命令模式的几个核心角色及其分工:
  • Command(命令基类):主要声明抽象命令类的接口
  • ConcreteCommand(命令实现):复写基类中声明的接口,实现具体的调用功能
  • Receiver(命令的内容):具体执行动作的对象
  • Invoker(命令调度和执行):全部命令的执行和调度入口
  • Client(命令装配者):创建具体的命令对象,组装命令对象和接收者
最近的文章

python设计模式之迭代器模式

迭代器模式意义:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。适用性: 访问一个聚合对象的内容而无需暴露它的内部表示。 支持对聚合对象的多种遍历。 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。举例:def FibonacciSequence(n): x = 0 y = 1 i = 1 while True: yield y if i == n: break ...…

水滴石穿继续阅读
更早的文章

python设计模式之责任链模式

责任链模式意义:将多个处理方法连接成一条链条,请求将在这条链条上流动直到该链条中有一个节点可以处理该请求;通常这条链条是一个对象包含对另一个对象的引用而形成链条,每个节点有对请求的条件,当不满足条件将传递给下一个节点处理。适用性: 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 可处理一个请求的对象集合应被动态指定。举例:class Bases(object): def __init__(se...…

水滴石穿继续阅读