zoukankan      html  css  js  c++  java
  • 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不是我们所需要类型

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

  • 相关阅读:
    第九篇 python基础之函数,递归,内置函数
    第六篇:python基础之文件处理
    第五篇:python基础之字符编码
    第四篇:python基础之条件和循环
    第三篇:python基础之数据类型与变量
    第二篇:python基础之核心风格
    第一篇:初识Python
    作业
    作业3
    作业2
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5000636.html
Copyright © 2011-2022 走看看