您的位置:首页 > 移动开发 > Swift

[老码团队]Swift中的协议 - 用协议来实现委托模式

2014-09-25 17:04 309 查看
委托是一种设计模式,它允许
结构体
将一些需要它们负责的功能
交由
(委托)
给其他的类型的实例。在这种设计模式中,会涉及到几个角色:

公共接口(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()
}
//翱翔于天际,侦查敌情
//穿行于黑夜,侦查敌情

如果想了解更多关于Swift的内容,或有看不懂请到老码官方微博:http://weibo.com/u/5241713117咆哮
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift 设计模式