// main.m
// 代理设计模式练习
#import <Foundation/Foundation.h>
#import "Person.h"
#import "LinkHome.h"
#import "LoveHome.h"
int main(int argc, const char * argv[]) {
/*
用代理实现学生找房子, 不具备找房子的能力
所以学生可以找另一个对象来帮它找房子, 那么另一个对象就是学生的代理
*/
Person *p = [Person new];
LinkHome *lh = [LinkHome new];
p.delegate = lh;
// LoveHome *lh = [LoveHome new];
// p.delegete = lh;
[p findHourse];
return 0;
}
// Person.h
// day17
#import <Foundation/Foundation.h>
//#import "StudentProtocol.h"
/*
协议的编写规范:
1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中
2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
3.协议中的方法名称一般以协议的名称protocol之前的作为开头
4.一般情况下协议中的方法会将触发该协议的对象传递出去
5.一般情况下一个类中的代理属于的名称叫做 delegate
6.当某一个类要成为另外一个类的代理的时候,
一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议.
在.m中用#import真正的导入一个协议的声明
*/
@class Person;
@protocol PersonProtocol <NSObject>
- (void)personFindHourse:(Person *)person;
@end
@interface Person : NSObject
//@property (nonatomic, strong) id<StudentProtocol> delegete;
@property (nonatomic, strong) id<PersonProtocol> delegate;
- (void)findHourse;
@end
// Person.m
#import "Person.h"
@implementation Person
- (void)findHourse
{
NSLog(@"学生想找房子");
// 通知代理帮他找房子
if ([self.delegate respondsToSelector:@selector(personFindHourse:)]) {
[self.delegate personFindHourse:self];
}
}
@end
// StudentProtocol.h
#import <Foundation/Foundation.h>
@protocol StudentProtocol <NSObject>
// 帮学生找房子
- (void)studentFindHourse;
@end
// LinkHome.h
#import <Foundation/Foundation.h>
//#import "Person.h"
@protocol PersonProtocol;
@interface LinkHome : NSObject <PersonProtocol>
@end
// LinkHome.m
#import "LinkHome.h"
#import "Person.h"
@implementation LinkHome
- (void)personFindHourse:(Person *)person
{
NSLog(@"%s", __func__);
}
@end
// LoveHome.h
#import <Foundation/Foundation.h>
@interface LoveHome : NSObject
@end
// LoveHome.m
#import "LoveHome.h"
@implementation LoveHome
@end