1、协议(Protocol)的概念
协议是定义了一组方法,让其他类遵守(实现)。协议本身不是类,协议的定义看起来比较类似一个类的接口(.h文件),不同的是协议没有父类也不能定义实例变量,它只能定义方法。
只要一个类遵守了一份协议,就拥有了这份协议中所有的方法声明。OC中不能直接继承多个父类但是可以实现多个协议。
2、协议的格式
(1)定义协议
@protocol 协议名称
//定义一组方法
@end
(2)实现协议
@interface 类名:父类名<协议名称>
@end
(3)协议的两个属性
@required(默认):表示必须实现的方法
@optional:表示可选的方法
3、协议的使用
(1)定义一个协议
@protocol ArchProtocol <NSObject>
@required
-(void)shoot;//士兵射击
@end
(2)定义几个类实现上述协议
//初级弓箭手
@interface StudentArchMan : NSObject<ArchProtocol>
@end
@implementation StudentArchMan
-(void)shoot{
NSLog(@"见习弓箭手射羽毛箭,攻击力为5");
}
@end
//中级弓箭手
@interface ArchMan :NSObject<ArchProtocol>
@end
@implementation ArchMan
-(void)shoot{
NSLog(@"普通弓箭手射铁箭,攻击力为8");
}
@end
//高级弓箭手
@interface SuperArchMan :NSObject<ArchProtocol>
@end
@implementation SuperArchMan
-(void)shoot{
NSLog(@"高级弓箭手射穿甲箭,攻击力为15");
}
@end
(3)调用这些类
NSMutableArray *array = [NSMutableArrayarray];
SuperArchMan *superMan = [[SuperArchManalloc] init];
StudentArchMan *srudentMan = [[StudentArchManalloc] init];
ArchMan *archMan = [[ArchManalloc] init];
[array addObject:superMan];
[array addObject:srudentMan];
[array addObject:archMan];
for (NSObject<ArchProtocol> *archManin array) {
[archMan shoot];
}
4、基协议
一个协议可以遵守多个协议,遵守了其他协议,就相当于拥有了其他协议中拥有的方法。OC中除了有一个NSObject类之外,还有一个NSObject协议,任何协议都遵守NSObject协议
自定义的协议都要求遵守NSObject协议
5、协议什么情况下定义在什么地方
协议可以单独定义在类的.h文件中,也可以创建一个.h文件定义协议
如果该协议仅仅用于单独一个类遵守,应该把协议定义在该类中;
如果协议需要很多类来遵守,就应该单独创建一个.h文件来定义协议。
6、使用协议来定义变量
如果程序需要使用协议来定义变量,有两种语法:
NSObject<协议1,协议2...> *变量名;
id<协议1,协议2...> 变量名;
通过上述语法格式定义的变量。它们编译时类型仅仅是所遵守的协议类型,因此只能调用该协议中定义的方法。
7、代理(委托)设计模式
设计模式(Design Pattern)描述了软件开发过程中若干重复出现的问题的解决方案,目的是提高程序的可扩展性和可维护性。
代理设计模式(delegate)是指一个对象提供机会给另一个对象中的行为变化做出反应。
8、代理模式的使用(以照顾小孩为例)
(1)定义一个协议
@protocol BabyProtocol <NSObject>
-(void)drink;
-(void)milk;
-(void)changeNappy;
-(void)play;
@end
(2)定义一个小孩的类
@interface Baby : NSObject
@property (nonatomic) NSObject<BabyProtocol> *grandma;
//定义宝宝的状态
@property (nonatomic) NSString *state;
-(void)cry;
@end
-(void)cry{
if ([_state isEqualToString:@"饿了"]) {
[_grandma milk];
}
else if ([_state isEqualToString:@"渴了"]) {
[_grandma drink];
}
else if ([_state isEqualToString:@"拉屎了"]) {
[_grandma changeNappy];
}
else {
[_grandma play];
}
}
(3)定义保姆类
@interface Grandma : NSObject<BabyProtocol>
@end
-(void)drink{
NSLog(@"给宝宝喝水");
}
-(void)milk{
NSLog(@"给宝宝喂奶");
}
-(void)changeNappy{
NSLog(@"给宝宝换尿布");
}
-(void)play{
NSLog(@"陪宝宝玩");
}
(4)使用代理实现照顾孩子的动作
Baby *baby = [[Baby alloc] init];
Grandma *grandma = [[Grandma alloc] init];
baby.grandma = grandma;
baby.state = @"饿了";
[baby cry];