1.通过中介公司找房子
//1:协议声明: #import <Foundation/Foundation.h> @protocol FindApartment <NSObject> -(void)findApartment; @end //2:代理角色声明(Agent.h)头文件声明 #import <Foundation/Foundation.h> #import "FindApartment.h" @interface Agent : NSObject <FindApartment> @end //3:代理角色实现(Agent.m)实现文件 #import "Agent.h" @implementation Agent -(void)findApartment{ NSLog(@"findApartment"); } @end //4:真实角色声明(Person.h)头文件声明 #import <Foundation/Foundation.h> #import "FindApartment.h" @interface Person : NSObject { @private NSString *_name; id<FindApartment> _delegate; //委托人(具备中介找房子的协议) } @property(nonatomic,copy) NSString *name; @property(nonatomic,assign)id<FindApartment> delegate; -(id)initWithName:(NSString *)name withDelegate:(id<FindApartment>) delegate; -(void)wantToFindApartment; @end //5:真实角色实现(Person.m)实现 #import "Person.h" //定义私有方法 @interface Person() -(void)startFindApartment:(NSTimer *)timer; @end @implementation Person @synthesize name=_name; @synthesize delegate=_delegate; -(id)initWithName:(NSString *)name withDelegate:(id<FindApartment>) delegate{ self=[super init]; if(self){ self.name=name; self.delegate=delegate; } return self; } -(void)wantToFindApartment{ [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:@"Hello" repeats:YES]; } -(void)startFindApartment:(NSTimer *)timer{ //NSString *userInfo=[timer userInfo]; [self.delegate findApartment]; } @end //6:测试代理main.m方法 #import <Foundation/Foundation.h> #import "Person.h" #import "Agent.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); Agent *agent=[[Agent alloc]init]; Person *jack=[[Person alloc]initWithName:@"jack" withDelegate:agent]; [jack wantToFindApartment]; [[NSRunLoop currentRunLoop]run]; [jack autorelease]; } return 0; }
2.代理设计模式的编码规范:
(1)一帮情况下,当协议属于谁,就将协议定义到谁的头文件中
(2)协议的名称一般以它属于那个类的类名开头,后面跟上protocol或delegate
(3)协议中的方法名称一般以协议的名称protocol之前的作为开头
(4)一般情况下,协议中的方法会将触发该协议的对象传递出去
(5)一般情况下,一个类中的代理的名称叫做 delegate;
(6)当一个类要成为另外一个类的代理的时候,一般情况下:
.h中用 @protocol 协议名称; 来告诉当前类,这是一个协议。
.m中 用 #import 类名 来真正导入协议的声明
例子:学生找房子
Student.h #import <Foundation/Foundation.h> @class Student; //通过代理来找房子,所以首先定义一个协议 @protocol StudentProtocol <NSObject> -(void)studentFindHourse:(Student *)student; @end @interface Student : NSObject //代理 @property(nonatomic, strong) id<StudentProtocol> delegate; //找房子 -(void)findHourse; @end ---------------------------------------------------------------------------------------- Student.m #import "Student.h" @implementation Student //学生通过代理找房子 -(void)findHourse{ NSLog(@"学生想找房子"); if ([self.delegate respondsToSelector:@selector(studentFindHourse:)]) { [self.delegate studentFindHourse:self]; } } @end ---------------------------------------------------------------------------------------- LoveHome.h #import <Foundation/Foundation.h> @protocol StudentProtocol;//标明StudentProtocol是一个协议 //爱家,专做销售房子的代理 @interface LoveHome : NSObject<StudentProtocol> @end ---------------------------------------------------------------------------------------- LoveHome.m #import "LoveHome.h" #import "Student.h" @implementation LoveHome -(void)studentFindHourse:(Student *)student{ NSLog(@"%s 帮忙找房子",__func__); } @end ---------------------------------------------------------------------------------------- main.m #import <Foundation/Foundation.h> #import "Student.h" #import "LoveHome.h" int main(int argc, const char * argv[]) { Student *stu = [[Student alloc] init]; LoveHome *lh = [[LoveHome alloc] init]; stu.delegate = lh; [stu findHourse]; return 0; }
根据规范,重写1:
//Person.h #import <Foundation/Foundation.h> @class Person; @protocol PersonProtocol <NSObject> -(void)personWantToFindApartment:(Person *)person; @end //Person要找房子 @interface Person : NSObject @property (nonatomic, assign) NSString *name; //找房子的代理 @property (nonatomic, strong) id<PersonProtocol>delegate; //构造方法 -(instancetype)initWithName:(NSString *)name withDelegate:(id<PersonProtocol>)delegate; //找房子 -(void)wantToFindApartment; @end //Person.m #import "Person.h" //定义私有方法 @interface Person() -(void)startFindApartment:(NSTimer *)timer; @end //实现Person @implementation Person -(instancetype) initWithName:(NSString *)name withDelegate:(id<PersonProtocol>)delegate{ self = [super init]; if (self) { self.name = name; self.delegate = delegate; } return self; } -(void) wantToFindApartment{ [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:@"代理找房子" repeats:YES]; } //实现私有方法 -(void) startFindApartment:(NSTimer *)timer{ NSString *info = [timer userInfo]; NSLog(@"1"); if ([self.delegate respondsToSelector:@selector(personWantToFindApartment:)]) { NSLog(@"%@",info); [self.delegate personWantToFindApartment:self]; } } @end //Agent.h //代理 #import <Foundation/Foundation.h> @protocol PersonProtocol; @interface Agent : NSObject<PersonProtocol> @end //Agent.m #import "Agent.h" #import "Person.h" @implementation Agent -(void)personWantToFindApartment:(Person *)person{ NSLog(@"%s 代理帮忙找房子",__func__); } @end //main.m #import <Foundation/Foundation.h> #import "Person.h" #import "Agent.h" int main(int argc, const char * argv[]) { @autoreleasepool { Agent *a = [[Agent alloc] init]; Person *p = [[Person alloc] initWithName:@"keen" withDelegate:a]; [p wantToFindApartment]; [[NSRunLoop currentRunLoop] run]; } return 0; }