协议: 是多个对象之间协商的一个接口对象
协议可以用来声明一大堆方法(不能申明成员变量)
只要类遵守了这个协议,就相当于拥有了这个协议中的所有申明
父类遵循了某个协议,子类也会遵循这个协议。
可以对象遵循协议 类遵循协议 协议遵循协议。
协议的关键字 :@protocol 遵守多个协议的时候用逗号隔开
协议的写法:@protocol 协议名 <基协议(NSObject)>
@required 必须实现方法 (不规定的时候默认也是必须实现)
@optional 可以实现也可以不实现方法
@end 结尾
注意:在写协议时,不是每一个文件只能写一个协议,可以在一个文件写多个协议。新的协议需要写在之前协议的@end之后
是创建了一个 Header File 类型的.h接口文件里写协议 。
谁遵守了协议 谁去实现这个方法。
代理模式:为别人做嫁衣 比如 A无法做到的事情找到B帮他完成,他们之间有个协议,B就需要遵守协议帮A完成
多个对象之间协同解决问题,通常运用在对象之间通信。
特点:使用了代理不需要子类化,简化代码,灵活
设置代理:@property(nonatomic,strong)id<协议的名字>代理的名字;// 这一行的意思:设置代理属性,这个属性为id类型便于其他遵守此协议的对象传入,使代码更灵活
绑定代理:让B为A做事, A.代理的名字=B
[A 要做的事情];
//
// main.m
// 看病
//
// Created by 非凡 程序员 on 15/11/5.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
//练习一:
//我想找个住房,因工作很忙便找了一个中介,帮忙找房子
//-我的代理是中介,在我需要找住房时,帮我找房子
//加分要求:
//1.指定所需户型
//
//练习二:
//我想去看电影,没时间跑去电影院,找了团购帮我买电影票
//-我的代理是团购,在我没时间去买票时,方便我买电影票
//加分要求:
//1.指定电影票和观看日期
//2.代理告知我当天电影场次
#import <Foundation/Foundation.h>
#import "Doctor.h"
#import "Sick.h"
#import "Nurse.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//实例化病人对象
Sick *xiaoMing=[[Sick alloc]init];
xiaoMing.name=@"小明";
//实例化医生对象
Doctor *aHua=[[Doctor alloc]init];
aHua.name=@"医生";
//实例化护士对象
Nurse *xiaoBai=[[Nurse alloc]init];
xiaoBai.name=@"护士";
//设置病人委托对象
xiaoMing.doctorDeleget=xiaoBai;
// 生病治病
[xiaoMing ill];
}
return 0;
}
//治病协议---新协议最好遵守基协议
@protocol sickDeleget <NSObject>
//协议的治疗方法,这里没有指定默认是一定实现的
-(void)cure;
@end
#import <Foundation/Foundation.h>
#import "cureSickProtocol.h"
#import "Doctor.h"
@interface Sick : NSObject
@property( nonatomic , strong ) NSString *name;
//设置代理属性,这个属性为id类型便于其他遵守此协议的对象传入,使代码更灵活
@property( nonatomic , strong )id<sickDeleget> doctorDeleget;
//病人方法,生病去看病
-(void)ill;
@end
#import "Sick.h"
@implementation Sick
-(void)ill{
NSLog(@"%@说,医生我生病了啊。。。",_name);
// 病人通过代理委托医生看病
[self.doctorDeleget cure];
}
@end
#import <Foundation/Foundation.h>
#import "cureSickProtocol.h"
@interface Doctor : NSObject<sickDeleget>//医生遵守协议
@property ( nonatomic , strong ) NSString * name ;
@end
#import "Doctor.h"
@implementation Doctor
//这个方法是协议中的,协议的方法是谁遵守协议谁实现方法,这里没有接口
-(void)cure{
NSLog(@"医生开始治病~");
}
@end
#import <Foundation/Foundation.h>
#import "cureSickProtocol.h"
@interface Nurse : NSObject<sickDeleget>
@property(nonatomic,strong)NSString *name;
@end
#import "Nurse.h"
@implementation Nurse
-(void)cure{
NSLog(@"护士开始治病~");
}
@end