day17 protocol
1. protocol的應用1
限定類型: 我們做某些事情都需要有一定的條件
例如: 找老婆
要求: 做飯\洗衣服
如果僅僅通過一個屬性來保存老婆對象,
那么我們是不知道給我們的老婆,是否可以做飯/洗衣服
- main
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Wife.h"
int main(int argc, const char * argv[]) {
// 1.創建一個人
Person *p = [Person new];
// 2.創建一個老婆
Wife *w = [Wife new];
// 3.把老婆給這個人
p.wife = w;
[p show];
return 0;
}
- Preson.h
#import <Foundation/Foundation.h>
@class Wife;
@class Person;
/*
1.一般情況下, 協議不用單獨定義一個文件, 哪個類需要用到這個協議
(哪個類需要限定其它類遵守某個協議), 那么協議就定義在哪個類中
A類要限定B類, 那么協議就寫在A類中
2.協議的名稱, 一般以限定這個協議的類名開頭,
后面跟上Protocol或Delegate
如果是A類限定B類, 那么協議名稱就以A類的類名開頭,
后面跟上Protocol或Delegate
3.被限定的那個類中, 如果用到了協議,
頭文件中應該使用@protocol, .m文件中使用#import
""導入協議
如果B類需要用到A類中定義的協議,
在.h文件中使用@protocol, .m文件中使用#import
4.如果A類用到了B類實現的協議中的方法,
使用之前為了保存程序安全,
必須先利用respondsToSelector方法判斷是否可以調用
5.協議中的方法, 一般情況下至少有一個參數,
誰觸發了這個協議, 就將誰傳遞出去
*/
//@protocol PersonProtocol <NSObject>
@protocol PersonDelegate <NSObject>
// 會做飯
- (void)cooking:(Person *)person;
// 會洗衣服
- (void)washing:(Person *)person;
@end
@interface Person : NSObject
@property (nonatomic, strong)Wife<PersonDelegate> *wife;
- (void)show;
@end
- Preson.m
#import "Person.h"
#import "Wife.h"
@implementation Person
- (void)show {
// 1.判斷老婆對象是否真的可以做飯/洗衣服/好工作
if ([_wife respondsToSelector:@selector(cooking:)]) {
[_wife cooking: self];
}
if ([_wife respondsToSelector:@selector(washing:)]) {
[_wife washing: self];
}
}
@end
- wife.h
#import <Foundation/Foundation.h>
@protocol PersonDelegate;
@interface Wife : NSObject <PersonDelegate>
@end
- wife.m
// 會做飯
- (void)cooking:(Person *)person {
NSLog(@"%s", __func__);
}
// 會洗衣服
- (void)washing:(Person *)person {
NSLog(@"%s", __func__);
}
@end
protocol應用場景2---代理
代理設計模式
代理設計模式應用場景
a. 當對象A無法處理某些行為的時候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象)
b. 當對象A發生了一些行為,想告知對象B(讓對象B成為對象A的代理對象)
c. 對象B想監聽對象A的一些行為(讓對象B成為對象A的代理對象)
應用舉例:保姆代理
需求: 設計一個保姆代理來照顧嬰兒吃飯睡覺
- main
#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nanny.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
//需求: 設計一個保姆代理來照顧嬰兒吃飯睡覺
Baby *baby = [Baby new];
Nanny *nanny = [Nanny new];
baby.nanny = nanny;
// Student *stu = [Student new];
// baby.nanny = stu;
NSLog(@"----------");
[baby babyHungry:56];
NSLog(@"---------------------");
[baby babySleepy:56];
NSLog(@"----------");
return 0;
}
- Baby.h
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProtocol <NSObject>
-(void)sleep:(Baby *)baby;
-(void)food:(Baby *)baby;
@end
@interface Baby : NSObject
@property(nonatomic, strong)id<BabyProtocol> nanny;
@property(nonatomic, assign)int hungry;
@property(nonatomic, assign)int sleepy;
-(void)babyHungry:(int)hungry;
-(void)babySleepy:(int)sleepy;
@end
- Baby.m
#import "Baby.h"
@implementation Baby
-(void)babyHungry:(int)hungry{
self.hungry = hungry;
NSLog(@"寶寶餓了, 饑餓度 = %i", self.hungry);
while (self.hungry >= 15){
[self.nanny food:self];
}
NSLog(@"不餓了, 饑餓度 = %i", self.hungry);
}
-(void)babySleepy:(int)sleepy{
self.sleepy = sleepy;
NSLog(@"寶寶困了, 犯困度 = %i", self.sleepy);
while(self.sleepy <= 90){
[self.nanny sleep:self];
}
NSLog(@"睡覺了, 犯困度 = %i", self.sleepy);
}
@end
- Nanny.h
#import <Foundation/Foundation.h>
@protocol BabyProtocol;
@interface Nanny : NSObject <BabyProtocol>
@end
- Nanny.m
#import "Nanny.h"
#import "Baby.h"
@implementation Nanny
-(void)sleep:(Baby *)baby{
NSLog(@"唱歌, 犯困度 = %i", baby.sleepy += 10);
}
-(void)food:(Baby *)baby{
NSLog(@"喂飯, 饑餓度 = %i", baby.hungry -= 10);
}
@end
- Student.h
#import <Foundation/Foundation.h>
@protocol BabyProtocol;
@interface Student : NSObject <BabyProtocol>
@end
- Student.m
#import "Student.h"
#import "Baby.h"
@implementation Student
-(void)food:(Baby *)baby{
baby.hungry -= 10;
NSLog(@"喂食, 饑餓度 = %i", baby.hungry);
}
-(void)sleep:(Baby *)baby{
baby.sleepy += 10;
NSLog(@"唱歌, 犯困度 = %i", baby.sleepy);
}
@end