Swift 委托/代理设计模式

Swift 中的委托/代理模式(以下简称"代理模式")与object-c的代理模式基本一致。

代理模式的基本思想就是将我(类或者结构体等)需要来完成的工作交给(委托给)另一个有我所规定的做这项工作能力的人(符合要求类型的对象等)来处理。

代理模式的实现需借助于我们上一篇文章所讲的协议。我们定义一个协议来封装那些指定的方法(做这项工作的能力),使实现这些协议的类等拥有这些方法,我们就可以将工作委托给他来处理。

举个实际例子,比如我要去租房,首先我是有租房的能力,但是我没有时间或者其他原因去做这件事,这个时候我就得找一个有租房能力的人或者机构去帮我 租房。比如说我找到了玛雅房屋让他们去帮我租租房。我只需要告诉他们我要一个大致什么位置,多大,什么类型,价格范围等,他们就可以帮我去租房。在这个例 子中 我就是一个要委托的类,我委托的对象有一些要求(也就是定义中所说的做这项工作的能力):能按照要求找房子。玛雅房屋就是接受委托的对象,因为他有满足我 要求的能力。如果说张三也有我所要求的找房子的能力,那么张三也可以作为我找房子的委托对象,至于我委托给谁都可以,只要他满足找房子的能力。


我们通过实例来实现:

首先我得定义协议,来写明我的要求有找房子的能力

  1. protocol RentProtocol{  
  2.     //协议内容  
  3.       
  4.     //有一个找房子的要求  
  5.     func Renting()  
  6. }  


然后我们在定义一个玛雅房屋,一个张三,让他们都实现这个协议

  1. class MaYaHouse: RentProtocol {  
  2.     func Renting() {  
  3.         println("我是玛雅房屋,我可以找房子")  
  4.     }  
  5. }  

 

  1. class ZhangSan: RentProtocol {  
  2.     func Renting() {  
  3.         println("我是张三,我可以找房子")  
  4.     }  
  5. }  


然后我们再定义一个我的类,我有一个属性,rentDelegate 他需要有找房子的能力,然后我要委托他找房子 Renting()

  1. class MyHouse{  
  2.       
  3.     var rentDelegate:RentProtocol?  
  4.       
  5. }  


然后我们新建一个MyHouse 的对象,然后给他赋值玛雅房屋的对象试试看能找房子不


  1. var maya=MaYaHouse()  
  2. var zhangsan=ZhangSan()  


  1. var maya=MaYaHouse()  
  2. var zhangsan=ZhangSan()  
  3.   
  4. var myHouse=MyHouse()  
  5. myHouse.rentDelegate=maya //我们会发现不管这里赋值是maya,还是 zhangsan 我们要找房子的时候都是调用下面一行方法,和这里赋值无关  
  6. myHouse.rentDelegate?.Renting()  


我们发现不管我们吧maya 还是zhangsan赋值给 myHouse(也即是我们委托给maya或者zhangsan) 我们都可以调用rentDelegate.Renting 来实现找房子

所以我们发现不管我们委托给谁,只要他有这个找房子的能力,而不需要管他们是用什么方式找房子的(也就是他们有实现代理规定的renging()方法就行,具体方法实现的功能我们不需要管)


我们试一下将一个自己有找房子功能 而没有按照我们的要求,也就是没有实现协议的 赋值给 rentDelegate 试一试

  1. class Lisi {  
  2.     func Renting(){  
  3.           
  4.         println("我是李四,我可以找房子")  
  5.     }  
  6. }  

 

  1. var lisi=Lisi()  
  2.   
  3. var myHouse=MyHouse()  
  4. myHouse.rentDelegate=lisi  
  5. myHouse.rentDelegate?.Renting()  


我们会发现编译不通过,lisi不是我们所需要类型

所以说委托对象一定要实现我们的规定协议才可以

posted @ 2015-11-27 14:44  brave-sailor  阅读(527)  评论(0编辑  收藏  举报