IOS中的代理模式
2015-08-05 07:23
288 查看
代理模式介绍:
代理模式官方定义是:为其他对象提供一种代理以控制对这个对象的访问。 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。 在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可 以在客户端和目标对象之间起到中介的作用。
举个好理解的例子来说明:
一个人Person对象,想去买电影票(询问电影票的剩余量,票价等信息), 但是由于自己没有空,所以他只能委托一个中介(代理商Agent对象) 帮他去完成这个动作,最后代理商可以把(询问的电影票相关信息) 回馈给Person。这就是一种典型的设计模式
为了展示这个例子,首先建立2个类,Person类和Agent类,下面是Person类的代码清单:
Person.h
#import <Foundation/Foundation.h> #import "Agent.h" @interface Person : NSObject { } @property(retain,nonatomic) Agent * delegate; //为Person 设置一个代理Agent! - (void)Ticketinfo; @end
Person.m
#import "Person.h" @implementation Person - (void)Ticketinfo { NSLog(@"票的价格是%d,剩余量是%d", [_delegate TicketPrice], [_delegate LeftTicketNum]); //Person想查询票的信息,其实是代理帮他查询的,他只负责获得结果就行了! } @end
Agent.h
#import <Foundation/Foundation.h> @interface Agent : NSObject - (int)TicketPrice; - (int)LeftTicketNum; @end
Agent.m
#import "Agent.h" @implementation Agent - (int)TicketPrice { return 200; } - (int)LeftTicketNum { return 10; } @end
main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "Agent.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [[Person alloc] init]; Agent *agent = [[Agent alloc] init]; p.delegate=agent; [p Ticketinfo]; } return 0; }
运行结果为:
2015-07-26 17:43:27.892 Proxy[1711:451007] 票的价格是200,剩余量是10
看完上面的例子,大概应该对代理模式有些了解了,不过在实际的项目中,不会这样设计,为什么呢?应为这样耦合行太高,如果
Person这个类离开
Agent类,是生存不了的。所以应当优化一下代理模式的设计!
还是接着上面的代码,进行优化设计。首先再建立一个名为
TciketSourceData的protocol,然后进行一系列的剪切,复制,修改等简单操作,如下:
- 把
Agent.h中声明的方法剪切到
TciketSourceData中
- 然后,再让
Agent类遵循
TciketSourceData协议,修改后的
Agent.h现在的样子是这样的:
#import <Foundation/Foundation.h> #import "TicketSourceData.h" @interface Agent : NSObject <TicketSourceData> @end
最后,把
Person.h中的
@property(retain,nonatomic) Agent * delegate;修改成
@property(retain,nonatomic) Agent * delegate;
然后运行吧,看看结果应该和我们上次演示的一模一样吧。
注意
请思考一个问题,利用这种方式,好处在哪里?首先Person和Agent的耦合性大大降低了!
其次就是,如果Person想找啊其他的Agent002,Agent003做代理也是可以的(只要遵守协议,实现相关协议方法就行)!
另外需要注意的是,ios开发中很多空间,如UITableView,collectionview等都利用的这种代理模式,一般充当代理角色的事Controller!如有兴趣,可以自己去研究一下!本篇文章主要介绍这种思想!
好了,ios中的代理模式先介绍到这里,下一篇博客介绍ios中的MVC设计模式,敬请关注!
相关文章推荐
- iOS开发基础之用三种不同方式创建Table View应用
- 58.iOS6 7 cell适配 tableView背景
- iOS中注册功能的体验探究
- iOS 9应用开发教程之iOS 9新特性
- iOS 8设置CLLocation授权
- iOS 8应用内跳转到系统设置
- IOS 如何实现滑动返回上一页
- iOS 9之应用内搜索(CoreSpotlight)API
- iOS开发中NSDictionary操作大全
- ios对于枚举的使用
- iOS中的数组操作大全
- iOS中如何获取用户的触摸操作
- iOS中添加Cordova到已存在的Xcode 工程
- iOS中的字符串操作大全
- iOS设计模式 - 代理
- iOS开发概述-12.手势处理
- IOS开发笔记_AFN中多线程依赖
- BIOS的常见问题及启动介绍
- iOS开发_Foundation框架
- ios字符串自适应rect