IOS设计模式-代理模式
一、什么是代理模式?
*代理是一种简单又功能强大的设计模式,这种模式用于程序中一个对象代表另一个对象与程序中的其他对象进行交互。
二、代理模式在什么时候应用?
*很多新手容易犯的错误是为了用代理模式而使用代理模式,其实代理模式只是众多设计模式中的一种,它的价值体现在它可以运用的合适的地方,而不是明明有其它更方便的设计模式而硬要用这个设计模式。我对代理模式的理解,感觉代理模式更像是一种传送模式,在不同对象之间进行传值。而IOS有很多传值方式,例如属性传值、代理传值、单例传值(实现共享)、通知中心传值、Block传值,那什么时候应该用代理传值呢,
例如:A页面push到B页面,如果B页面有信息需要回传(回调)到A页面,那么就用代理模式,其中B定义协议和代理,A确认并实现代理,A为B的代理。
举例:让Person A让代理B去核实票价和剩余票数,并把结果告诉A
/**
* 创建一个协议,在协议中构建两个方法,分别返回票价和剩余票数
*/
#import <Foundation/Foundation.h>
@protocol TicketDelegate <NSObject>
//返回票价
- (double)price;
//返回剩余票数
- (int)remainTicketNumber;
@end
/**
* 代理遵守协议并实现协议中的方法
*/
#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@interface Agent : NSObject<TicketDelegate>
@end
/**
* 代理实现协议中的方法
*/
#import "Agent.h"
@implementation Agent
//返回票价
- (double)price
{
return 100;
}
//返回剩余票数
- (int)remainTicketNumber
{
return 10;
}
@end
/**
* PersonA中创建一个遵守协议的代理
*/
#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@interface Person : NSObject
@property (nonatomic,strong) id <TicketDelegate> delegate;
- (void)buyTicket;
@end
#import "Person.h"
@implementation Person
- (void)buyTicket
{
// 叫代理去帮自己买票(询问一下票价、询问一下票的剩余张数)
double price1 = [_delegate price];
int number = [_delegate remainTicketNumber];
NSLog(@"票价是%f,还剩余%d张",price1,number);
}
@end