命令模式:设计模式系列(六)

  命令模式(Command Pattern):是把一个请求封装成一个对象,调用者调用这个对象等同于执行对应的请求操作,而操作结果则返回给接收者的设计模式,归类为行为型模式。

  这一模式的解读分为以下几个方面:

  • 需要执行很多种命令。
  • 调用命令的与接收命令的非一体。
  • 命令对象执行方法可扩展性很大,甚至可以互相组合。

  使用命令模式的思考过程如下:

  1. 调用者类实例对象需要有一些事情需要请求给其它类执行。
  2. 这些事情有什么都有,需要不同的处理方法。
  3. 每一件事情处理完,都会告诉接收者。

  那么再明确一下结构,命令模式抽象出来需要有一个调用者类、命令类、命令类抽象出来的接口或协议、接收者类。

命令模式示例代码如下(Swift语言):

class Receiver{
    
    func show(){
        print("I am Receiver,I can do something after the command");
    }
}


protocol CommandBluePrint{
    
    func excute();
}

class Command: CommandBluePrint {
    
    private var receiver:Receiver?;
    
    func excute() {
        print("I am command,and I am doing something for Invoker");
        receiver = Receiver();
        receiver!.show();
    }
}

class Invoker{
    
    private var command:CommandBluePrint?;
    
    func setCommand(cmd:CommandBluePrint){
        print("I am Invoker,I am setting the command");
        self.command = cmd;
    }
    
    func invoke(){
        print("I am Invoker,and I am going to let the command be excuted");
        command!.excute();
    }
}

var receiver = Receiver();
var command = Command();
var invoker = Invoker();
invoker.setCommand(command);
invoker.invoke();

  代码分析:根据上面明确的结构,Invoker类实例对象通过设置并调用遵循了CommandBluePrint协议的Command类实例对象及其方法excute,执行类一些操作,然后通知Receiver类实例对象,最后由Receiver类实例对象进行最后一步操作(在这里是执行类show方法)。于是以上代码的输出结果如下:

I am Invoker,I am setting the command
I am Invoker,and I am going to let the command be excuted
I am command,and I am doing something for Invoker
I am Receiver,I can do something after the command

  总结:命令模式的整个生命周期只要联想一下远程ssh操作的登陆过程就差不多能理解了,但需要注意的是,把调用者和接收者分为两个部分其实是本着“低耦合”的总原则,在一些地方当然也是可以调用者与接收者一致,但是多写一个类就能降低耦合,扩展的时候也可以分开扩展,并且在不方便调用者与接收者一致的情况下也适用,何乐而不为呢?


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6