1.代理模式核心思想:A类委托B类做某件事,然后A类获取B类的执行的返回结果!

举例:女孩想去买电影票,但是自己不亲自去而是委托男孩了解电影电影票信息,同时女孩获得男孩买票的结果,代码模拟实现:

/*********************************** Gril.h *************************************/
#import <Foundation/Foundation.h>
@class Boy;
@interface Gril : NSObject// “女孩”想去买电影票
- (void)buyTicket;// “女孩”声明自己的代理对象
@property (nonatomic,retain) Boy *boy;
// @property (nonatomic,retain) Boy *delegate;@end

/*********************************** Gril.m *************************************/
#import "Gril.h"
#import "Boy.h"@implementation Gril// “女孩”想买电影票
- (void)buyTicket
{// “女孩”直接获取自己的代理(“男孩”)的方法返回值 剩余电影票的个数int count = [_boy leftTicketsCount];// “女孩”直接获取自己的代理(“男孩”)的方法返回值 单张电影票的价格double price = [_boy ticketPrice];// 输出女孩获得的信息NSLog(@"还剩%d张电影票,每张票价是%.2f元",count,price);}// Girl类引用了Boy类 那么在Girl类释放之前先释放Boy对象
- (void)dealloc
{[_boy release];[super dealloc];
}
@end

/*********************************** Boy.h *************************************/
#import <Foundation/Foundation.h>@interface Boy : NSObject// 查询单张票价
- (double)ticketPrice;
// 查询还剩多少张电影票
- (int)leftTicketsCount;@end

/*********************************** Boy.m *************************************/
#import "Boy.h"
@implementation Boy// 实现单张票价的查询
- (double)ticketPrice
{return 20;
}// 实现剩余的电影票
- (int)leftTicketsCount
{return 3;
}
@end

/*********************************** main.m *************************************/
#import <Foundation/Foundation.h>
#import "Boy.h"
#import "Gril.h"
int main(int argc, const char * argv[])
{@autoreleasepool {Gril *gril = [[[Gril alloc] init] autorelease];Boy *boy = [[[Boy alloc] init] autorelease];// 为girl中的boy属性赋值 完成"代理思想"gril.boy = boy; // gril.delegate = boy;
        [gril buyTicket];}return 0;
}

 小结:可以看出Gril类的代理对象已固定是Boy类,这样的话代码耦合性太强,如果下次需要修改Gril类的代理对象为其他对象则不便于修改

修改后的代码如下:

/*********************************** Gril.h *************************************/
#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@class Boy;@interface Gril : NSObject// “女孩”想去买电影票
- (void)buyTicket;// “女孩”声明自己的代理对象为任意对象 但是对象必须遵守TicketDelegate协议
@property (nonatomic,retain) id<TicketDelegate> delegate; //  这样的话 任何对象都可以作为代理对象 只要遵守协议即可@end

/*********************************** Gril.m *************************************/
#import "Gril.h"
#import "Boy.h"@implementation Gril// “女孩”想买电影票
- (void)buyTicket
{// “女孩”直接获取自己的代理(“男孩”)的方法返回值 剩余电影票的个数int count = [_delegate leftTicketsCount];// “女孩”直接获取自己的代理(“男孩”)的方法返回值 单张电影票的价格double price = [_delegate ticketPrice];// 输出女孩获得的信息NSLog(@"还剩%d张电影票,每张票价是%.2f元",count,price);}// Girl类引用了Boy类 那么在Girl类释放之前先释放Boy对象
- (void)dealloc
{[_delegate release];[super dealloc];
}
@end

// 定义协议/***************************** TicketDelegate.h文件 ******************************/
#import <Foundation/Foundation.h>// 定义协议:那么代理对象必须要遵循协议@protocol TicketDelegate <NSObject>
// 查询单张票价
- (double)ticketPrice;
// 查询还剩多少张电影票
- (int)leftTicketsCount;
@end

/*********************************** Boy.h *************************************/
#import <Foundation/Foundation.h>
#import "TicketDelegate.h"// 声明代理对象要遵守的协议
@protocol TicketDelegate;// Boy作为Gril的代理则必须遵守协议
@interface Boy : NSObject <TicketDelegate>@end

/*********************************** Boy.m *************************************/
#import "Boy.h"
@implementation Boy// 实现单张票价的查询
- (double)ticketPrice
{return 20;
}// 实现剩余的电影票
- (int)leftTicketsCount
{return 3;
}
@end

/*********************************** main.m *************************************/
#import <Foundation/Foundation.h>
#import "Boy.h"
#import "Gril.h"
int main(int argc, const char * argv[])
{@autoreleasepool {Gril *gril = [[[Gril alloc] init] autorelease];Boy *boy = [[[Boy alloc] init] autorelease];// 为girl中的boy属性赋值 完成“代理思想”gril.delegate = boy; // gril.delegate = boy;
        [gril buyTicket];}return 0;
}

小结:修改后的代码耦合性相对来比较弱!假设如果再要为Gril类添加代理对象,Gril类本身不需要任何修改,只要新建的代理对象遵守协议即可

2.联想UITableView要显示内容时它本身并不知道要显示要分几组、每组显示多少行、每行显示的内容等,也是要依靠它的代理对象UITableViewDataSource来执行返回的结果会赋值给UITableView中的相应参数,才会进行显示

转载于:https://www.cnblogs.com/QM80/p/3624635.html

iOS 层层推进实现代理模式相关推荐

  1. 蓝懿IOS委托模式代理模式

    今天刘国斌老师讲了有关oc语言里的委托模式(代理模式),通过了一个打地鼠的游戏讲解了委托模式的功能作用,之后连带讲解了协议的书写和使用. 打地鼠功能包括屏幕随机出现地鼠,点击消失,如果不点击5秒后自动 ...

  2. IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘

    *********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMVie ...

  3. OC学习篇之---代理模式

    在前一篇文章我们介绍了OC中的协议的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,这篇文章我们就来介绍一下OC ...

  4. C++模拟实现Objective-C协议和代理模式

    Objective-C的协议和代理是运用最多的特性之一,可以说在苹果系列开发中无处不在.事实上很多人都不知道其背后的原理.事实上简单点说,这就是设计模式中的代理模式的经典运用.代理模式简单点说就是为其 ...

  5. iOS开发之通过代理逆向传值

    在iOS开发中,传值是几乎每个App都会用到的,对于传统的顺向传值应该说是比较简单的,但是逆向传值往往会用到代理模式来实现,很多同学在这一块有迷惑,迷惑的不是怎么逆向传值,而是不理解代理模式,下面就来 ...

  6. 模块递归拆分法: 设计模式 设计原则,复杂层次设计举例。系统重构 装饰模式,门面模式,代理模式

    程序员最牛逼的能力是模块拆分能力, 然后才能利用模块依赖的工具,java 9 或者 runtime期的osgi ,其他maven插件,maven build期. 其他idea插件,类似阿里云的代码规范 ...

  7. 关于代理模式PAC和全局模式的区别

    关于代理模式PAC和全局模式的区别 PAC模式和全局模式的优缺点对比 众所周知,传统有一大弊端,即:只能使用全局模式,这样情况下,虽然可以加速国外网站,但打开国内网站速度会变慢: 加速度不但支持全局模 ...

  8. PAC模式和全局代理模式

    PAC模式和全局代理模式的优缺点对比 众所周知,传统有一大弊端,即:只能进行全局模式代理,这样情况下,虽然可以代理,但打开国内网站速度会变慢: 加速度不但支持全局模式,同时也支持PAC模式(智能分流, ...

  9. 设计模式——结构型模式之代理模式和适配器模式(类比+图解,从无到有,一文看懂几种模式的区别)

    设计模式 系列文章: 一.创建型模式--工厂模式 二.创建型模式--单例模式.原型模式 三.创建型模式--建造者模式 四.结构型模式--装饰者模式 五.结构型模式--代理模式.适配器模式 文章目录 设 ...

最新文章

  1. Python培训分享:python如何用cookie实现自动模拟登录?
  2. LESSON 9.4 集成算法的参数空间与网格优化
  3. oracle 体系结构认识,Oracle数据库体系结构简单认识一
  4. linux 链接 文件,聊聊 Linux 里的文件链接
  5. OO第三单元总结:JML
  6. [环境搭建]SDN网络感知服务与最短路径应用
  7. SQL Server 中使用 Try Catch 处理异常
  8. Ubuntu上安装使用Docker
  9. Oracle为JDK 8寻求社区参与
  10. 三个梯度磁场_第二节 梯度磁场系统
  11. jquery扩展与插件
  12. 不小心执行了rm -f,除了跑路,如何恢复?
  13. resnet的瓶颈层的子层res4b22的命名规则
  14. Python爬取百度热榜前十条数据
  15. 早该知道的7个JavaScript技巧
  16. fanuc机器人控制柜接线_工业机器人控制柜及使用方法
  17. 最新emoji表情代码大全_最新出早晨好漂亮图片带字问候语 微信群夏季早晨好问候语祝福语表情图片大全...
  18. 抖音快手短视频 影视后期制作工具网址大全
  19. dhtmlxgantt pro 7.1.10 | dhtmlxgantt 专业版 7.1.10
  20. 【智能优化算法】基于融合改进 Logistics 混沌和正弦余弦算子的自适应 t 分布海鸥算法求解单目标优化问题附matlab代码

热门文章

  1. linux操作系统信号捕捉函数之回调函数小结
  2. linux运算_CentOS「linux」学习笔记22:算术运算符、逻辑运算符、关系运算符
  3. SPOJ - QTREE3Query on a tree again!——树链剖分
  4. 【Leetcode | 11】268. 缺失数字
  5. 系统盘点Android开发者必须掌握的知识点,全网疯传
  6. [LeetCode] Two Sum
  7. BZOJ4890 Tjoi2017城市
  8. 【EasyNetQ】- 使用Future Publish调度事件
  9. 线性代数-矩阵-转置 C和C++的实现
  10. [archlinux][hardware] 查看SSD的使用寿命