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

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

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

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

我们通过实例来实现:

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

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

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

  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. var rentDelegate:RentProtocol?
  3. }

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

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

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

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

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

  1. class Lisi {
  2. func Renting(){
  3. println("我是李四,我可以找房子")
  4. }
  5. }
  1. var lisi=Lisi()
  2. var myHouse=MyHouse()
  3. myHouse.rentDelegate=lisi
  4. myHouse.rentDelegate?.Renting()

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

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

转载于:https://www.cnblogs.com/Free-Thinker/p/5000636.html

Swift 委托/代理设计模式相关推荐

  1. 如何理解delegate (委托)设计模式

    delegate (委托)设计模式 iOS 编程语言是 Objective-C,   简称 OC. 谈起 OC的特性,人们常说,OC 不支持多继承.但 Delegate 弥补了这个缺陷. 有了Dele ...

  2. Java设计模式(十三):代理设计模式

    代理模式可以分为以下四类 远程代理(Remote Proxy):控制对远程对象(不同地址空间)的访问,它负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求. 虚拟代理(Virtua ...

  3. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  4. Java中的代理设计模式

    代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们. 代理设计模式是一种结 ...

  5. iOS开发篇——OC 协议和代理设计模式介绍

    蓝鸥iOS培训讲师推荐:好久没和大家沟通了,没和大家沟通了,今天就和大家说说有关OC内容协议和代理设计模式.首先要讲的是协议 一.协议 OC中的协议和接口有些相似,协议中定义的方法,在类中实现.协议一 ...

  6. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  7. 代理设计模式详解(java版本)

    今天给大家详细的介绍一下23中常用的设计模式中的代理设计模式,代理模式分为两种,分别为静态代理和动态代理. 意图:为其他对象提供一种代理以控制对这个对象的访问. 解析: 1,其他对象:目标对象,想要访 ...

  8. 把委托说透(4):委托与设计模式

    委托与很多设计模式都有着千丝万缕的联系,在前面的随笔中已经介绍了委托与策略模式的联系,本节主要来讨论委托与其他两个模式:观察者模式和模板方法模式. 委托与观察者模式 在.NET中,很多设计模式得到了广 ...

  9. java之 代理设计模式

    1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设 ...

  10. 【Spring】Spring第二天 - AOP 详解、动态代理设计模式(JDK和cglib)

    一.AOP AOP 和 Filter 能够实现的 功能相似. AOP 和 Filter 的区别: AOP拦截的是类中方法(切点),只要方法能够被Spring管理,那么这个方法就能够被拦截. Filte ...

最新文章

  1. 高级网络配置《 bond team桥接 》的建立
  2. 多线程导出大规模excel文件
  3. socket 非阻塞 linux,linux 非阻塞式socket编程求助。。
  4. visual studio输入法打不了中文_目前比较满意的手机输入法方案:Gboard + 搜狗词库...
  5. 单核工作法13:永不拖延(下)
  6. js_jQuery【下拉菜单联动dom操作】
  7. 一篇特别长的总结(C专家编程)
  8. 中介者模式java_图解Java设计模式之中介者模式
  9. rpmbuild - 构建 RPM 打包
  10. .NET下多线程初探
  11. 如何用Java解压缩WAR文件
  12. Duilib介绍-3
  13. PPT设置自动生成页码
  14. Pivotal 任命Lionel Lim为Pivotal公司副总裁兼亚太区常务董事
  15. 让Win7做DHCP服务器
  16. 国家省、市、县、镇/街道地址
  17. java计算机毕业设计基于ssm的协同过滤算法的电影推荐系统(源代码+数据库+Lw文档)
  18. 工作队列模式(任务队列)| RabbitMQ系列(二)
  19. 手机端网页设计尺寸大小
  20. 杜牧“借问酒家何处有,牧童遥指杏花村”杏花村究竟指的是哪里?安徽的池州比较可靠

热门文章

  1. 跨域小结(为什么form表单提交没有跨域问题,但ajax提交有跨域问题)
  2. 增强for中操作集合元素的误区---java.util.ConcurrentModificationException
  3. 解决Adobe Flash Player不是最新版本方法
  4. 一个基于protobuf的极简RPC
  5. c++ Protobuf中set_allocated引起的double free core dump
  6. Spring之IOC容器
  7. android 控件覆盖关系,Android设置viewGroup和其子控件两者之间的焦点关系【原创】...
  8. matlab三维三角网格,有限元分析利用matlab的gplot函数实现三维划分网格的方法
  9. mybatis配置指定的数据库连接池、mybatis配置多个数据源
  10. (day 18 - 辅助栈)剑指 Offer 30. 包含min函数的栈