• 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不是我们所需要类型

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

  • 相关阅读:
    mac 安装了docker,使用命令提示:bash : docker :command not found 的解决办法
    延世韩国语第1册第1课第1节内容提要안녕하십니까?
    延世韩国语第1册第1课第3节内容提要회사원이 아닙니다。会社员不是的(我不是公司职员)
    韩国语字母发音(元音/母音)
    2022年4月10日,随笔18,排名59596。
    延世韩国语第1册第1课第2节内容提要어느 나라 사람입니까?
    requests https忽略证书警告的几种方法
    requests post接口模拟上传文件
    requests 模拟multipart/formdata提交数据方式的方法
    《现代操作系统(中文第四版)》实验一 bash脚本实现cal
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5000636.html
Copyright © 2020-2023  润新知