委托是一种设计模式,它允许类
或结构体
将一些需要它们负责的功能交由
(委托)
给其他的类型的实例。在这种设计模式中,会涉及到几个角色:
公共接口(Interface):负责封装起需要被委托的功能
代理者(Delegate):被委托者,通过它来调用被委托的功能
委托者(mandator):将他们负责的功能委托给其他的类或结构体,即被委托者
一个码农成长的过程中,如果要保证写出的代码是灵活的,可复用的,健壮的,那设计模式是必须掌握的基本技能,同时,这也有可能是企业考察应聘者能力的考察点之一。虽然在GOF的书中,delegation并没有单独里描述为一种设计模式,但委托模式却是最广泛的使用在软件设计当中,同时,它还是其他设计模式,比如state模式,strategy模式必不可少的组成部分。在C++中,我们把公共接口封装到类,然后通过继承来实现功能委托;在C#和JAVA中,我们可以更方便的通过实现公共接口(interface)来实现;而在Swift中,我们则通过协议来实现委托模式,协议将承担公共接口的角色,把需要被委托的函数和方法封装起来
,然后要求遵循者
拥有这些被委托的函数和方法
。
具体的使用方法,老码还是通过例子来介绍:
看过冰与火之歌的朋友都知道,在那个魔幻的世界中有一个种人叫做易形者(skinchanger),他们可以让灵魂进入其他动物甚至是其他人的身体里面,从而控制他们的身体获得他们的能力:
- @objc protocolskinChangerDelegate
{
- var skinType:String
- func
Spy()
- optional func
Investigate()
- optional attack()
- }
这里,我们就定义了这样的一个协议,它把易形者可以从动物那获得的能力,或者说动物们可以委托给易形者的能力封装了起来。当然,这种能力应该是多样的,通过动物的眼睛获得视野,通过动物的活动区域探索地形,甚至可以通过动物的狩猎或防御技能进行攻击。我们把他们分别封装到skinChangerDelegate中,当然,因为动物的身体相对于拿钢剑,穿盔甲的骑士来说是脆弱的,所以野人军队更看重的是侦查的能力,而非战斗力上的输出,所以对易形者来说利用动物的能力来侦查是必须的,其他能力则是可选的,正如代码中Spy()是必要需求,
而func Investigate()和func attack()是可选需求一样,关于可选,老码会在后头的章节再做详细的介绍。
现在,构造一支野人军队,易形者是组成的一部分,
- classWildArmy:
{
- var
warrior:Int =
1000- var
giant:Int =
25- var
mammoth:Int =
10- var
animalDelegate:
skinChangerDelegate?func
spyByAnimal() {
- animalDelegate?.spy()
- }
- func
attack() {
- //具体实现
- }
- }
多种类型动物是可以被控制的:
- classEagleSkin: skinChangerDelegate
{
var
name:String = “鹰”
- func
spy() {
println(“
翱翔于天际,侦查敌情”)
- }
- }
- classWolfSkin: skinChangerDelegate
{
var
name:String = “狼”
- func
spy() {
println(“
穿行于黑夜,侦查敌情”)
- }
- }
这支军队由曼斯率领,军中有多种动物,通过易形者作为代理,可为野人军队所用:
- let
armyOfMance =
WildArmy()
- let
animals :[
SkinChanger] = [
EagleSkin(),WolfChanger()]
- for animal in animals{
- armyOfMance. animalDelegate = animal
- armyOfMance. spyByAnimal()
- }
- //翱翔于天际,侦查敌情
- //穿行于黑夜,侦查敌情