1、利用协议实现代理模式的主要思路是:
1)定义一个协议,里面声明代理类需要实现的方法列表。
2)创建一个代理类,遵守上面的代理协议
3)在需要代理类的类Baby中,定义一个对象,【类型为id ,且遵守代理协议】的成员变量delegate
4)在Baby类中调用成员变量delaget(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值。
【用父类还是id<协议>】
不使用父类的原因:
1)如果抽象一个父类的话,还是有局限性,因为很多时候,不同类是无法抽象出共同的父类的。
2)有时候,某个类已经继承了其他类,这里不能再继承类了。
2、实现举例:
【要求】学生需要找房源,中介可以提供房源,
【学生类】Student
行为:需要住房
【中介类】InnerHome和YeDian
行为:找房
【协议类】findHouseProtocol
协议:找房
【协议类findHouseProtocol.h文件】
#import <Foundation/Foundation.h>
//找房子协议
@protocol findHouseProtocol <NSObject>
//协议内容:找房子
-(void)findHouse;
@end
【学生类Student.h文件】
#import <Foundation/Foundation.h>
#import "findHouseProtocol.h"
@interface Student : NSObject
-(void)needHouse;
//定义一个对象,【类型为id ,且遵守代理协议】的成员变量delegate
@property(nonatomic,strong) id<findHouseProtocol>delegate;
@end
【Studen.m文件】
#import "Student.h"
@implementation Student
-(void)needHouse{
NSLog(@"学生需要一个温暖的屋子...");
[self.delegate findHouse];
}
@end
【InnerHome.h文件】
#import <Foundation/Foundation.h>
#import "findHouseProtocol.h"
//如家宾馆:遵守找房协议
@interface InnerHome : NSObject<findHouseProtocol>
@end
【InnerHome.m文件】
#import "InnerHome.h"
@implementation InnerHome
//实现找房协议中的方法
-(void)findHouse{
NSLog(@"如家帮您找房....");
}
@end
【YeDian.h文件】
#import <Foundation/Foundation.h>
#import "findHouseProtocol.h"
//夜店宾馆:遵守找房协议
@interface YeDian : NSObject<findHouseProtocol>
@end
【YeDian.m文件】
#import "YeDian.h"
@implementation YeDian
//实现找房协议中的方法
-(void)findHouse{
NSLog(@"夜店为您提供全方面服务,叶良辰为您宝航护驾....");
}
@end
【main.m文件】
#import <Foundation/Foundation.h>
#import "Student.h"
#import "InnerHome.h"
#import "YeDian.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
//定义一个黑中介
InnerHome *ih = [InnerHome new];
YeDian *yd = [YeDian new];
//定义一个学生类对象
Student *stu = [Student new];
stu.delegate = ih;
[stu needHouse];
stu.delegate = yd;
[stu needHouse];
}
return 0;
}
【打印结果】
2015-10-07 19:53:55.080 找房子[2056:303] 学生需要一个温暖的屋子...
2015-10-07 19:53:55.082 找房子[2056:303] 如家帮您找房....
2015-10-07 19:53:55.083 找房子[2056:303] 学生需要一个温暖的屋子...
2015-10-07 19:53:55.083 找房子[2056:303] 夜店为您提供全方面服务,叶良辰为您宝航护驾....