[老码团队]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
optional func
optional attack()
}
这里,我们就定义了这样的一个协议,它把易形者可以从动物那获得的能力,或者说动物们可以委托给易形者的能力封装了起来。当然,这种能力应该是多样的,通过动物的眼睛获得视野,通过动物的活动区域探索地形,甚至可以通过动物的狩猎或防御技能进行攻击。我们把他们分别封装到skinChangerDelegate中,当然,因为动物的身体相对于拿钢剑,穿盔甲的骑士来说是脆弱的,所以野人军队更看重的是侦查的能力,而非战斗力上的输出,所以对易形者来说利用动物的能力来侦查是必须的,其他能力则是可选的,正如代码中
Investigate()和func attack()是可选需求一样,关于可选,老码会在后头的章节再做详细的介绍。
现在,构造一支野人军队,易形者是组成的一部分,
classWildArmy:
var
var
var
var
animalDelegate?.spy()
}
func
//具体实现
}
}
多种类型动物是可以被控制的:
classEagleSkin: skinChangerDelegate
func
}
}
classWolfSkin: skinChangerDelegate
func
}
}
let
let
for animal in animals{
armyOfMance. animalDelegate = animal
armyOfMance. spyByAnimal()
}
//翱翔于天际,侦查敌情
//穿行于黑夜,侦查敌情
如果想了解更多关于Swift的内容,或有看不懂请到老码官方微博:http://weibo.com/u/5241713117咆哮
类或
结构体将一些需要它们负责的功能
交由
(委托)给其他的类型的实例。在这种设计模式中,会涉及到几个角色:
公共接口(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咆哮
相关文章推荐
- 利用KVC实现无需协议的委托模式
- Objective-C设计模式(MVC)的实现,以及协议与委托的运用
- OC_协议实现代理委托模式
- iOS设计模式之自己设计与实现委托与协议
- swift详解之十一------------协议、委托(代理)模式
- Swift学习第十一枪-基于协议的MVVM模式的实现
- 自定义协议或实现委托
- HTTP协议下客户/服务器模式中信息交换的实现:
- C#中使用委托和事件实现观察者模式(observer pattern)
- 学习设计模式之旅 / 观察者(Observers)委托实现.. 推荐
- Objective-C 协议 简介 +委托的实现
- C#中使用委托和事件实现观察者模式(observer pattern)
- NTLM挑战模式散列认证加密协议过程,算法实现与一些想法
- 使用委托和事件实现观察者模式(Observer Pattern)
- 用PHP的反射实现委托模式
- 委托实现了首次定义类时无法确定的一些细节,是通过协议实现的
- 利用协议实现委托
- .Net中使用事件和委托实现Observer模式(二)
- NTLM挑战模式散列认证加密协议过程,算法实现与一些想法
- 用Java动态代理实现委托模式