命令模式:设计模式系列(六)
in Archived / Pattern
命令模式(Command Pattern):是把一个请求封装成一个对象,调用者调用这个对象等同于执行对应的请求操作,而操作结果则返回给接收者的设计模式,归类为行为型模式。
这一模式的解读分为以下几个方面:
- 需要执行很多种命令。
- 调用命令的与接收命令的非一体。
- 命令对象执行方法可扩展性很大,甚至可以互相组合。
使用命令模式的思考过程如下:
- 调用者类实例对象需要有一些事情需要请求给其它类执行。
- 这些事情有什么都有,需要不同的处理方法。
- 每一件事情处理完,都会告诉接收者。
那么再明确一下结构,命令模式抽象出来需要有一个调用者类、命令类、命令类抽象出来的接口或协议、接收者类。
命令模式示例代码如下(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操作的登陆过程就差不多能理解了,但需要注意的是,把调用者和接收者分为两个部分其实是本着“低耦合”的总原则,在一些地方当然也是可以调用者与接收者一致,但是多写一个类就能降低耦合,扩展的时候也可以分开扩展,并且在不方便调用者与接收者一致的情况下也适用,何乐而不为呢?