一 : 代理设计模式简述
自己做不了的事情,教给别人帮你完成,并且,完成的那个结果返还给你.这个就是代理,举一个简单的小例子 : 假如足球明星C罗
去参加一些商务活动,但是C罗
所具有的能力只有足球踢得好
,帅
,有魅力
这写,不会管安排酒店,安排飞机,安排安保,安排活动进程这些东西.这时候需要一个代理人,帮助C罗
去完成这些琐事的东西,接下来看看,如何用代码实现这一场景.
二 : 代理设计模式应用场景
- 当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
- 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
- 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
三 : 设计并书写C罗的代理
定义C罗最近想做的事情
@interface CRonaldo : NSObject
//relax
-(void)releax;
//电视演出
-(void)TVShow;
@end
@implementation CRonaldo
-(void)TVShow{
NSLog(@"C罗进行节目录制");
}
-(void)releax{
NSLog(@"C罗在夏威夷海滩和妻子吹风");
}
@end
需要一个人来帮助自己去安排一下出演,和假期但是C罗
身份在那摆着呢,这种事情不能自己做,这里要安排一个助手也就是代理在这里.
@interface Assistant : NSObject
@end
定义一个协议,那种人才有资格当这个助手呢,简单一,具有安排演出和安排假期能力的人能当上这个助手,定义一个协议,协议内容为安排假期和安排演出
@protocol AssistantProtocol
//安排演出
-(void)playTvShow;
//安排假期
-(void)playHoliday;
@end
让我们助手遵守这些协议
#import "AssistantProtocol.h"
@interface Assistant : NSObject
@end
@implementation Assistant
-(void)playTvShow{
NSLog(@"预定飞机票");
NSLog(@"排除车子");
}
- (void)playHoliday{
NSLog(@"安排假期时间");
NSLog(@"准备旅行用品,和居住酒店")
}
助手的条件,现在已经搞定了,我们现在去给C罗
安排这么一个人来做这些事情
@interface CRonaldo : NSObject
//relax
-(void)releax;
//电视演出
-(void)TVShow;
@property(nonatomic,weak)id assisDegate;
@end
#import "CRonaldo.h"
@implementation CRonaldo
-(void)TVShow{
if ([self.assisDegate respondsToSelector:@selector(playTvShow)] ) {
[self.assisDegate playTvShow];
}
NSLog(@"C罗进行节目录制");
}
-(void)releax{
if ([self.assisDegate respondsToSelector:@selector(playHoliday)] ) {
[self.assisDegate playHoliday];
}
NSLog(@"C罗在夏威夷海滩和妻子吹风");
}
到现在为止呢,安排等琐碎的小事就算安排出去了,毕竟大明星都有自己的助理,接下来测试一下
//创建助手一位
Assistant *assis = [[Assistant alloc]init];
//请出我们的球星C罗
CRonaldo *ron = [[CRonaldo alloc]init];
//给C罗安排助手
ron.assisDegate = assis;
//协助C罗完成 度假 和 演出
[ron TVShow];
[ron releax];
打印结果
四 : 实际开发中的代理
一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中
协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
协议中的方法名称一般以协议的名称protocol之前的作为开头
一般情况下协议中的方法会将触发该协议的对象传递出去
一般情况下一个类中的代理属于的名称叫做 delegate
我们根据这些小小的建议在来修改一下C罗
与助手
的书写方式
#import
@protocol AssistantProtocol ;
//安排演出
-(void)playTvShow;
//安排假期
-(void)playHoliday;
@end
@interface CRonaldo : NSObject
//relax
-(void)releax;
//电视演出
-(void)TVShow;
@property(nonatomic,weak)id assisDegate;
@end