A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 弥修斯 中级黑马   /  2015-8-20 18:38  /  781 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

利用协议实现代理模式
定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象
而代理对象可以在客户端和目标对象之间起到中介的作用。

使用代理模式可以降低耦合度。大大的增强了代码的弹性。

例:小明想看电影,但是没时间买票 于是就拜托小强去买票
利用 协议 ,我们可以把协议当做一个 “用户”与 “代理”之间的中转站
以下是这个例子的协议
  1. @protocol TicketDelegate <NSObject>  
  2. //票价  
  3. - (double) ticketPrice;  
  4. //剩了多少张票  
  5. - (int) leftTicketNumber;  
  6. @end  
复制代码
让代理类遵守协议 并且实现应该实现的方法
  1. @interface Agent : NSObject <TicketDelegate>  
  2.   
  3. @end  
复制代码
这样有了 一个可以代理协议 跟一个代理,还可以通过协议 实现更多的代理
  1. @implementation Person  
  2.   
  3. //想看电影  
  4. - (void) buyTicket  
  5. {  
  6.     //让代理帮忙买票(询问票价 剩余张数)  
  7.     double price = [_delegate ticketPrice];  
  8.     int number = [_delegate leftTicketNumber];  
  9.     NSLog(@"通过代理知:票价 = %f,剩余票数 = %d",price, number);  
  10. }  
  11.   
  12. @endl  
复制代码
在person类中 _delegate这个变量代表着 所使用的代理
在上面已经说了要使用id类型 但id类型必须要遵守协议
才能使_delegate 能够使用协议中的方法
这样就解决了上面所说的无法识别(代理中的方法)的问题

  1. @interface Person : NSObject  

  2. - (void) buyTicket;  
  3. @property (nonatomic,retain) id<TicketDelegate> delegate;   // 必须遵守协议  
  4.   
  5. @end
复制代码




1 个回复

倒序浏览
不知道怎么说明转载出处
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马