android工程师开发IOS oc浅析(20)之代理模式

24 篇文章 0 订阅

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

举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票

最简单的方式就是 建立一个person类(小明) 一个agent类(代理类)

agent类 帮person去买票或者问票价 并且返回消息 给person

这样的话person只需要 调用 agent就可以获得自己想要的消息 非常方便

但是 , 代理并不只是有一个 当person想换另一个代理的时候 就需要换成另一个代理 nextagent

很明显 这样会很麻烦 于是我们想到了 使用万能指针 id类型, 这样就可以不用每次都改变代码

但是这样做就会出另外的问题,使用id声明 一个代表着代理的变量时 系统是不“认识”它的 因为

这属于 运行期的多态 在编译期无法识别 代理类 nextagent中 的方法。

所以我们需要一个更灵活 低耦合的模式

利用 协议 ,我们可以把协议当做一个 “用户”与 “代理”之间的中转站

以下是这个例子的协议

@protocol TicketDelegate <NSObject>  

//票价  
- (double) ticketPrice;  

//剩了多少张票  
- (int) leftTicketNumber;  


@end 

让代理类遵守协议 并且实现应该实现的方法

    @interface Agent : NSObject <TicketDelegate>  

    @end  

这样我们就有了 一个可以代理协议 跟一个代理

另外,我们可以通过协议 实现更多的代理

@implementation Person  

//想看电影  
- (void) buyTicket  
{  
    //让代理帮忙买票(询问票价 剩余张数)  
    double price = [_delegate ticketPrice];  
    int number = [_delegate leftTicketNumber];  
    NSLog(@"通过代理知:票价 = %f,剩余票数 = %d",price, number);  
}  

@endl 

在person类中 _delegate这个变量代表着 所使用的代理
在上面已经说了要使用id类型 但id类型必须要遵守协议
才能使_delegate 能够使用协议中的方法
这样就解决了上面所说的无法识别(代理中的方法)的问题

@interface Person : NSObject  

- (void) buyTicket;  

//拥有一个代理  
// 必须遵守协议  
@property (nonatomic,retain) id<TicketDelegate> delegate;  

@end 

通过使用协议 person可以使用 许多代理 并且 不需要提前知道这个代理具体是什么 只需要知道它遵守什么协议就好了。

以上就是一个简单的代理 模式 虽然简单 却有着非常高的效率 以及 低耦合性

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值