iOS 层层推进实现代理模式
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 层层推进实现代理模式相关推荐
- 蓝懿IOS委托模式代理模式
今天刘国斌老师讲了有关oc语言里的委托模式(代理模式),通过了一个打地鼠的游戏讲解了委托模式的功能作用,之后连带讲解了协议的书写和使用. 打地鼠功能包括屏幕随机出现地鼠,点击消失,如果不点击5秒后自动 ...
- IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘
*********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMVie ...
- OC学习篇之---代理模式
在前一篇文章我们介绍了OC中的协议的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,这篇文章我们就来介绍一下OC ...
- C++模拟实现Objective-C协议和代理模式
Objective-C的协议和代理是运用最多的特性之一,可以说在苹果系列开发中无处不在.事实上很多人都不知道其背后的原理.事实上简单点说,这就是设计模式中的代理模式的经典运用.代理模式简单点说就是为其 ...
- iOS开发之通过代理逆向传值
在iOS开发中,传值是几乎每个App都会用到的,对于传统的顺向传值应该说是比较简单的,但是逆向传值往往会用到代理模式来实现,很多同学在这一块有迷惑,迷惑的不是怎么逆向传值,而是不理解代理模式,下面就来 ...
- 模块递归拆分法: 设计模式 设计原则,复杂层次设计举例。系统重构 装饰模式,门面模式,代理模式
程序员最牛逼的能力是模块拆分能力, 然后才能利用模块依赖的工具,java 9 或者 runtime期的osgi ,其他maven插件,maven build期. 其他idea插件,类似阿里云的代码规范 ...
- 关于代理模式PAC和全局模式的区别
关于代理模式PAC和全局模式的区别 PAC模式和全局模式的优缺点对比 众所周知,传统有一大弊端,即:只能使用全局模式,这样情况下,虽然可以加速国外网站,但打开国内网站速度会变慢: 加速度不但支持全局模 ...
- PAC模式和全局代理模式
PAC模式和全局代理模式的优缺点对比 众所周知,传统有一大弊端,即:只能进行全局模式代理,这样情况下,虽然可以代理,但打开国内网站速度会变慢: 加速度不但支持全局模式,同时也支持PAC模式(智能分流, ...
- 设计模式——结构型模式之代理模式和适配器模式(类比+图解,从无到有,一文看懂几种模式的区别)
设计模式 系列文章: 一.创建型模式--工厂模式 二.创建型模式--单例模式.原型模式 三.创建型模式--建造者模式 四.结构型模式--装饰者模式 五.结构型模式--代理模式.适配器模式 文章目录 设 ...
最新文章
- Python培训分享:python如何用cookie实现自动模拟登录?
- LESSON 9.4 集成算法的参数空间与网格优化
- oracle 体系结构认识,Oracle数据库体系结构简单认识一
- linux 链接 文件,聊聊 Linux 里的文件链接
- OO第三单元总结:JML
- [环境搭建]SDN网络感知服务与最短路径应用
- SQL Server 中使用 Try Catch 处理异常
- Ubuntu上安装使用Docker
- Oracle为JDK 8寻求社区参与
- 三个梯度磁场_第二节 梯度磁场系统
- jquery扩展与插件
- 不小心执行了rm -f,除了跑路,如何恢复?
- resnet的瓶颈层的子层res4b22的命名规则
- Python爬取百度热榜前十条数据
- 早该知道的7个JavaScript技巧
- fanuc机器人控制柜接线_工业机器人控制柜及使用方法
- 最新emoji表情代码大全_最新出早晨好漂亮图片带字问候语 微信群夏季早晨好问候语祝福语表情图片大全...
- 抖音快手短视频 影视后期制作工具网址大全
- dhtmlxgantt pro 7.1.10 | dhtmlxgantt 专业版 7.1.10
- 【智能优化算法】基于融合改进 Logistics 混沌和正弦余弦算子的自适应 t 分布海鸥算法求解单目标优化问题附matlab代码
热门文章
- linux操作系统信号捕捉函数之回调函数小结
- linux运算_CentOS「linux」学习笔记22:算术运算符、逻辑运算符、关系运算符
- SPOJ - QTREE3Query on a tree again!——树链剖分
- 【Leetcode | 11】268. 缺失数字
- 系统盘点Android开发者必须掌握的知识点,全网疯传
- [LeetCode] Two Sum
- BZOJ4890 Tjoi2017城市
- 【EasyNetQ】- 使用Future Publish调度事件
- 线性代数-矩阵-转置 C和C++的实现
- [archlinux][hardware] 查看SSD的使用寿命