------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
1. 定义:
为其它对象提供一种代理以用来控制这个对象,我们不关心代理如何完成的,只关心代理有没有完成。
例如:小明想吃饭了,但是自己又不想做饭,所以他请了个保姆,为了保证自己的权益和家里安全,所以小明跟保姆签了一份协议,这份协议中声明了保姆只能做什么事情,比如说协议中声明了保姆只能做饭、洗碗、扫地等,保姆需要遵守协议,如果保姆不遵守这份协议,小明就可以另外换一个保姆。所以保姆就是代理,代理必须遵守某个协议,如果代理不遵守这个协议,它就不能成为某个对象的代理。
条件:如果要成为代理,则必须遵守某个协议(协议用于声明方法,限制代理必须拥有某个方法)。
作用:可以监听某个方法是否被触发。
优点:耦合性较低,增加了代码的弹性。
例如代理被删除了,但是Person还在。代理和对象之间互不影响。
2.事例
一个人Peron想要带女朋友去看电影,但是他又不想去电影院买票,因此他要找中介买票,或者要别人帮他去买,所以他找了一个代理,当然他跟代理签了一份协议,协议名为TickProtocol这份协议主要是说明要代理帮他问问票的价格和票的剩余数量。
协议TickProtocol.h文件如下:用来声明代理需要做什么事情
#import <Foundation/Foundation.h>
@protocol TickProtocol <NSObject>
- (int)PriceTick; // 声明询问票价格的方法
- (int)LeftTick; // 声明剩余票数的方法
@end</span>
代理Agent.h文件如下:
#import <Foundation/Foundation.h>
@protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议
@interface Agent : NSObject<TickProtocol> // 代理必须遵守这份协议
@end</span>
代理Agent.m文件如下:
#import "Agent.h"
#import "TickProtocol.h"
@implementation Agent
// 实现协议中的询问票的价格
- (int)PriceTick
{
return 30;
}
// 实现协议中的查看剩余票的方法
- (int)LeftTick
{
return 15;
}
@end
</span>
人Person.h文件如下:
#import <Foundation/Foundation.h>
@class Agent; // 声明有Agent类
@protocol TickProtocol; // 声明有TickProtocol协议
@interface Person : NSObject
// 声明买票方法
- (void)Buy;
// 声明一个代理
@property (nonatomic,retain)id<TickProtocol> DeleAgent; // 代理属性DeleAgent遵守协议TickProtocol
@end
人Person.m文件如下:
#import "Person.h"
#import "Agent.h"
#import "TickProtocol.h"
@implementation Person
// 实现买票方法
- (void)Buy
{
int Price = [_DeleAgent PriceTick]; // 调用代理的方法买票
int LeftTick = [_DeleAgent LeftTick]; // 调用代理方法查看票的剩余数量
NSLog(@"price = %d,leftTick = %d",Price,LeftTick);
}
@end
主文件main.m文件如下:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
#import "Agent2.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 创建人对象p
Person *p = [[Person alloc] init];
// 创建代理对象a
Agent *a = [[Agent alloc] init];
// 人的代理指向a
p.DeleAgent = a;
[p Buy];
}
return 0;
}
打印结果是:
price = 30,leftTick = 15。</span>
如果我们把代理删掉,Person还是在,Person可以另外找个代理2询问电影票的价格和剩余数,也就是说如果代理挂掉了也完全不会影响到Person买电影票的情况。
有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。
总结:使用代理的最大好处就是类与类之间的耦合性降低了,我们可以针对Person或Agent增加另外的方法和成员变量,不需要考虑增加后是否对另外的类造成影响,增加了程序的弹性。
本文通过一个买电影票的例子,介绍了代理模式的基本概念、实现方式及其优势。代理模式通过为其他对象提供代理来控制对象的行为,降低了类间的耦合度。
1916

被折叠的 条评论
为什么被折叠?



