------- android培训、java培训、ios培训、期待与您交流! ----------
一.协议(protocol)
协议的定义
@protocol 协议名称
//方法声明列表
@end;
在默认的情况下,只要是协议里声明过的方法,遵守此协议的类 就必须要要实现协议里声明的所有的方法,否则系统就会发出警告。一个类可以同时遵守多个协议,而在OC中类的继承只能是单一继承。 前面说道在默认的情况下需要类要实现协议里的全部方法,OC中提供了两个关键字 @required和@optional
二.代理模式
严格来说,代理模式并不是一种特殊的代码,而是由协议引申而来的一种设计模式,例:由一个婴儿,她本身不会自己照顾自己吃饭睡觉,需要有人喂食有人哄她睡觉,此时,她的父母为了满足婴儿的需求请了一个保姆,保姆与婴儿之中存在协议,协议需要一个会照顾小孩吃饭睡觉的保姆,若不符合,婴儿的父母就会将她辞退,这时,符合协议内容的保姆便是婴儿的代理人。
由此,结合协议与代理模式写一串代码:
#import <Foundation/Foundation.h>
#import "baby.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
baby * b=[baby new];
baomu * bao=[baomu new];
b.baomu=bao; //定义一个保姆与保姆并使保姆成为这个婴儿的代理人,注意,当保姆不符合协议时会发出黄色警告。
NSLog(@"睡眠值:%d",b.sleepzhi);
NSLog(@"体力值:%d",b.tilizhi);
[b wangtosleep]; //当婴儿需要吃饭睡觉时,便由保姆执行另一段方法。
[b wanttoeat];
}
return 0;
}
#import <Foundation/Foundation.h>
@protocol take_care_about_the_baby <NSObject> //这就是协议,其中规定了保姆类需要有喂食和哄小孩睡觉两个方法,一旦保姆类不存在着两个方法便会报错
-(void)feedBabyEat;
-(void)takeBabySleep;
@end
#import <Foundation/Foundation.h>
#import "baomu.h"
@interface baby : NSObject
@property (nonatomic,strong) baomu *baomu;
@property(nonatomic,assign) int tilizhi;
@property(nonatomic,assign) int sleepzhi;
-(void)wanttoeat;
-(void)wangtosleep;
@end
#import "baby.h"
@implementation baby
-(instancetype)init{
if (self=[super init]) {
_sleepzhi=100;
_tilizhi=100;
}
return self;
}
-(void)wanttoeat{ //宝宝的两个方法,当需要吃饭睡觉时,让保姆执行相应的方法
[_baomu feedBabyEat];
_tilizhi+=10;
NSLog(@"体力值:%d",_tilizhi);
}
-(void)wangtosleep{
[_baomu takeBabySleep];
_sleepzhi+=10;
NSLog(@"睡眠值:%d",_sleepzhi);
}
@end
#import <Foundation/Foundation.h>
#import "take care about the baby.h"
@interface baomu : NSObject <take_care_about_the_baby> //将协议写入.h文件中,注意,协议中拥有的方法不需要类进行再次声明便可使用,但默认情况下必须使用,除非使用@optional使得方法可选
@end
#import "baomu.h"
@implementation baomu
-(void)feedBabyEat{
NSLog(@"宝宝饿了,保姆喂他喝了点奶水");
}
-(void)takeBabySleep{
NSLog(@"宝宝累了,保姆哄他睡觉");
}
@end