一 代理模式定义
@protocol PersonDelegate;
@interface Person : NSObject
@interface Seller : NSObject<PersonDelegate>
@property(strong,nonatomic)Person *person;
-(void) sell;
#import "Seller.h"
@implementation Seller
在我们实际生活中代理情况无处不在,你在淘宝上面买东西,你使用支付宝平台支付,卖家请物流公司发货、你请朋友帮你拿包裹,在这个过程中支付宝、物流公司、你朋友都扮演者“第三者”的角色在帮你完成物品的购买,这里的第三者我们可以将其称之为代理者。
// main.m
// Proxy
//
// Created by zhangzhe on 14-4-9.
// Copyright (c) 2014年 Haifeng. All rights reserved.
//
所谓代理就通过引用一个新的对象来实现对真实对象的操作或者将新的对象当做真实对象的一个替身,这种实现的机制就是代理模式,通过引用代理对象来访问真实对象就是代理模式的设计动机。
在GOF的中定义为:为其他对象提供一种代理以控制对这个对象的访问。代理者可以作任何东西的接口:网络连接、内存中的大物件、档案或其它昂贵或无法复制的资源。
二 实例说明
Subject类:定义了RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方都可以用Proxy。
RealSubject类:定义Proxy所代表的真实实体。
Proxy类:保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
代理模式的应用场合:
第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
第二:虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
第三:安全代理,用来控制真实对象访问时的权限。
第四:智能引用,是指当调用真实对象时,代理处理另外一些事。本文的例子就是采用了这一点。
三 代码实现
程序有两个类,一个是销售员Seller类,一个是Person类,Person委托Seller帮他卖房子。
代码如下:
//// main.m
// Proxy
//
// Created by zhangzhe on 14-4-9.
// Copyright (c) 2014年 Haifeng. All rights reserved.
//
/*委托者 Person类的实现*/
@protocol PersonDelegate;
@interface Person : NSObject
{
id _delegate;
}
-(void)setDelegate:(id<PersonDelegate>)delegate;
-(void)sellHouse;
@end
@protocol PersonDelegate <NSObject]] >
-(void)sellHouse;
#import "Person.h"
@implementation Person
id _delegate;
}
-(void)setDelegate:(id<PersonDelegate>)delegate;
-(void)sellHouse;
@end
@protocol PersonDelegate <NSObject]] >
-(void)sellHouse;
@end
@implementation Person
-(void)setDelegate:(id<PersonDelegate>)delegate
{
_delegate = delegate;
}
-(void)sellHouse
_delegate = delegate;
}
-(void)sellHouse
{
[_delegate sellHouse];
}
头文件中定义了PersonDelegate协议,协议中有个sellHouse方法,这个人可以自己卖房子,但是自己不想卖,要委托给Seller卖。
Person类中有个_delegate成员变量,这个就是代理中最重要的部分,它代表了委托给了谁,这个程序中,它其实代表一个Seller,我们要定义成id型的,是因为我们可能还可以委托给其他人,比如朋友啦等等,所以要用id。
}
@end
/*代理者 Seller类的实现*/
#import "Person.h"@interface Seller : NSObject<PersonDelegate>
@property(strong,nonatomic)Person *person;
-(void) sell;
@end
@synthesize person;
-(void) sell
-(void) sell
{
person = [[Person alloc]init];
person.delegate = self;
[person sellHouse];
}
- (void)sellHouse
person = [[Person alloc]init];
person.delegate = self;
[person sellHouse];
}
- (void)sellHouse
{
NSLog(@"Seller help person sell house");
}
int main (int argc, const char * argv[])
{
@autoreleasepool
NSLog(@"Seller help person sell house");
}
@end
/*main函数*/
#import "Seller.h"int main (int argc, const char * argv[])
{
@autoreleasepool
{
Seller *seller = [[Seller alloc] init];
[seller sell];
}
return 0;
iOS开发中,这种场景会经常出现,这种场景我们抽象的思考一下,你会发现其实就是两个对象之间的一个通信! 源对象产生事件,将事件通知给其他对象进行处理。
Seller *seller = [[Seller alloc] init];
[seller sell];
}
return 0;
}
四 IOS中的代理模式
而代理模式是对这种场景的一种解决方案,那解决了什么呢?解决了两个对象之间的通信并且解耦合!例如输入框对象产生事件之后,将事件通知给控制器对象,但是在输入框的类中没有与控制器对象紧密耦合,这样的话,输入框对象也可以将事件通知给其他对象,只要其他对象作为输入框的代理对象就可以了。
解决两个对象之间的通信,除了代理模式,在iOS开发中常见的还有:KVO、通知(NSNotification)、Block
五 总结