Swift World:设计模式-命令

从今天开始,我们将讨论专注于对象之间通信的行为模式。 它包括命令,中介,观察者,状态,策略等。

在本文中,我们将介绍命令模式。 就像在现实世界中一样,命令是从其调用者(即调用者)发送到接收者的请求。 通过隔离和封装请求,此模式将调用方和接收方分开,如下图所示。

从命令模式— Wikipedia

那它给我们带来什么好处呢? 让我们从车上的故事开始吧。

protocol Car { 
func move ()
}
 class Sedan : Car { 
func move () {
print ("Sedan is moving.")
}
}
 class SUV : Car { 
func move () {
print ("SUV is moving.")
}
}

现在,您作为iOS应用开发者,拥有一辆轿车并每天开车。

 class Developer { 
let sedan = Sedan ()
func driveCar () {
sedan .move ()
}
}

一天,您从App Store赚了很多钱,就买了另一辆SUV。 如果要驱动它,则需要在类中添加一个实例。

 class Developer { 
let sedan = Sedan ()
let suv = SUV ()
 func driveSedan () { 
sedan .move ()
}
 func driveSUV () { 
suv .move ()
}
}

但是,如果您的应用变得流行起来,有一天让您成为百万富翁怎么办? 您有很多好车,您的班级变得ated肿。 这是命令模式的放映时间。

 protocol Command { 
func execute ()
}
 class MovementCommand : Command { 
var car: Car
 init (car: Car ) { 
self. car = car
}
 func execute () { 
car .move ()
}
}

在命令中,我们放入了汽车,它是接收器,并请求使汽车行驶。 然后,您要做的就是用命令实例替换所有汽车。

 class Developer { 
var command: Command
 init (command: Command ) { 
self. command = command
}
 func drive () { 
command .execute ()
}
}

让我们看看如何使用它。

 let sedan = Sedan () 
let sedanMovementCommand = MovementCommand (car: sedan)
 let suv = SUV () 
let suvMovementCommand = MovementCommand (car: suv)
 let developer = Developer (command: sedanMovementCommand) 
developer .drive ()

命令模式在iOS应用开发中非常流行,以至于有一个特定的类NSInvocation来帮助创建命令。 您可以参考其文档以获取详细说明。 即使它在Swift中不可用,我们也可以将其作为命令模式的示例。