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

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

公共接口(Interface):负责封装起需要被委托的功能

代理者(Delegate):被委托者,通过它来调用被委托的功能

委托者(mandator):将他们负责的功能委托给其他的类或结构体,即被委托者

一个码农成长的过程中,如果要保证写出的代码是灵活的,可复用的,健壮的,那设计模式是必须掌握的基本技能,同时,这也有可能是企业考察应聘者能力的考察点之一。虽然在GOF的书中,delegation并没有单独里描述为一种设计模式,但委托模式却是最广泛的使用在软件设计当中,同时,它还是其他设计模式,比如state模式,strategy模式必不可少的组成部分。在C++中,我们把公共接口封装到类,然后通过继承来实现功能委托;在C#和JAVA中,我们可以更方便的通过实现公共接口(interface)来实现;而在Swift中,我们则通过协议来实现委托模式,协议将承担公共接口的角色,把需要被委托的函数和方法封装起来,然后要求遵循者拥有这些被委托的函数和方法

具体的使用方法,老码还是通过例子来介绍:

看过冰与火之歌的朋友都知道,在那个魔幻的世界中有一个种人叫做易形者(skinchanger),他们可以让灵魂进入其他动物甚至是其他人的身体里面,从而控制他们的身体获得他们的能力:

 
  
  
  
  
  1. @objc protocolskinChangerDelegate{
  2.     var skinType:String
  3. func Spy()
  4. optional func Investigate()
  5. optional attack()
  6. }

这里,我们就定义了这样的一个协议,它把易形者可以从动物那获得的能力,或者说动物们可以委托给易形者的能力封装了起来。当然,这种能力应该是多样的,通过动物的眼睛获得视野,通过动物的活动区域探索地形,甚至可以通过动物的狩猎或防御技能进行攻击。我们把他们分别封装到skinChangerDelegate中,当然,因为动物的身体相对于拿钢剑,穿盔甲的骑士来说是脆弱的,所以野人军队更看重的是侦查的能力,而非战斗力上的输出,所以对易形者来说利用动物的能力来侦查是必须的,其他能力则是可选的,正如代码中Spy()是必要需求,func Investigate()和func attack()是可选需求一样,关于可选,老码会在后头的章节再做详细的介绍。

现在,构造一支野人军队,易形者是组成的一部分,

  
  
  
  
  1. classWildArmy: {
  2. var warrior:Int = 1000
  3.     var giant:Int = 25
  4.     var mammoth:Int = 10
  5.     var animalDelegate: skinChangerDelegate?
  6.      func spyByAnimal() {
  7.          animalDelegate?.spy()
  8. }
  9.     func attack() {
  10.          //具体实现
  11.     }
  12.  
  13. }

多种类型动物是可以被控制的:

  
  
  
  
  1. classEagleSkin: skinChangerDelegate{
  2.     var name:String = “鹰
  3. func spy() {
  4.     println(“翱翔于天际,侦查敌情”)
  5. }
  6. }
  7. classWolfSkin: skinChangerDelegate{
  8.     var name:String = “狼
  9. func spy() {
  10.     println(“穿行于黑夜,侦查敌情”)
  11. }
  12. }
这支军队由曼斯率领,军中有多种动物,通过易形者作为代理,可为野人军队所用:
  
  
  
  
  1. let armyOfMance = WildArmy()
  2. let animals :[ SkinChanger] = [EagleSkin(),WolfChanger()]
  3. for animal in animals{
  4.     armyOfMance. animalDelegate = animal
  5.     armyOfMance. spyByAnimal()
  6. }
  7. //翱翔于天际,侦查敌情
  8. //穿行于黑夜,侦查敌情
如果想了解更多关于Swift的内容,或有看不懂请到老码官方微博:http://weibo.com/u/5241713117咆哮

你可能感兴趣的:(设计模式,swift)