// 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