oc66--代理模式應用2
阿新 • • 發佈:2017-08-27
修改 esp 無法 sleep har imp selector pan net
// // BabyProtocol.h #import <Foundation/Foundation.h> @class Baby; @protocol BabyProtocol <NSObject> // 餵嬰兒吃東西 - (void)feedFood:(Baby *)baby; // 哄嬰兒睡覺 - (void)hongBaby:(Baby *)baby; @end
// // Baby.h // day17 #import <Foundation/Foundation.h> #import "BabyProtocol.h" @class Nanny, Studnet;/* 什麽是代理設計模式 心相印和超市 超市就是心相印的代理, 它可以幫助心相印賣紙巾 也就是說, 代理也幫助另外一個類做一些事情 代理設計模式的應用場景 3.當對象A無法處理某些行為的時候,想讓對象B幫忙處理(讓對象B成為對象A的代理對象) , 代理就相當於助手一樣。 嬰兒無法自己吃東西, 也無法自己入睡, 所以可以讓保姆幫忙處理. 只要讓保姆成為嬰兒的代理就可以幫嬰兒餵它吃東西和哄他睡覺 */ @interface Baby : NSObject // 饑餓程度 @property (nonatomic, assign) int hungry; // 睡意 @property (nonatomic, assign) intsleep; // 吃東西 - (void)food; // 困了 - (void)sleepy; // 讓嬰兒擁有一個保姆 //@property (nonatomic, strong) Nanny *nanny; //@property (nonatomic, strong) Studnet *stu; // 如果使用id類型來接收保姆, 如果將來換保姆了, 嬰兒類不用修改代碼,id就是object, @property (nonatomic, strong) id<BabyProtocol> nanny; @end
// // Baby.m #import "Baby.h" #import"Nanny.h" @implementation Baby - (void)food { self.hungry += 5; NSLog(@"要吃東西 %i", self.hungry); // 通知保姆 if ([self.nanny respondsToSelector:@selector(feedFood:)]) { [self.nanny feedFood:self]; } } - (void)sleepy { self.sleep += 5; NSLog(@"困了 %i", self.sleep); // 通知保姆 if ([self.nanny respondsToSelector:@selector(hongBaby:)]) { [self.nanny hongBaby:self]; } } @end
// // Nanny.h #import <Foundation/Foundation.h> #import "BabyProtocol.h" @class Baby; @interface Nanny : NSObject <BabyProtocol> /* // 餵嬰兒吃東西 - (void)feedFood:(Baby *)baby; // 哄嬰兒睡覺 - (void)hongBaby:(Baby *)baby; */ @end
// // Nanny.m #import "Nanny.h" #import "Baby.h" @implementation Nanny - (void)feedFood:(Baby *)baby { baby.hungry -= 10; NSLog(@"餵嬰兒吃東西 %i", baby.hungry); } - (void)hongBaby:(Baby *)baby { baby.sleep += 10; NSLog(@"哄嬰兒睡覺 %i", baby.sleep); } @end
// // Studnet.h #import <Foundation/Foundation.h> #import "BabyProtocol.h" @class Baby; @interface Studnet : NSObject <BabyProtocol> /* // 餵嬰兒吃東西 - (void)feedFood:(Baby *)baby; // 哄嬰兒睡覺 - (void)hongBaby:(Baby *)baby; */ @end
// // Studnet.m #import "Studnet.h" #import "Baby.h" @implementation Studnet - (void)feedFood:(Baby *)baby { baby.hungry -= 10; NSLog(@"餵嬰兒吃東西 %i", baby.hungry); } - (void)hongBaby:(Baby *)baby { baby.sleep += 10; NSLog(@"哄嬰兒睡覺 %i", baby.sleep); } @end
// // main.m // 協議的應用場景2-代理設計模式 #import <Foundation/Foundation.h> #import "Baby.h" #import "Nanny.h" #import "Studnet.h" #import "Teacher.h" #import "Dog.h" int main(int argc, const char * argv[]) { // 1.創建嬰兒 Baby *b = [Baby new]; // 2.創建保姆 Nanny *n = [Nanny new]; // 3.將保姆賦值給嬰兒呢 b.nanny = n; // 4.換保姆 Studnet *stu = [Studnet new]; b.nanny = stu; // 5.再次換保姆 Teacher *tea = [Teacher new]; b.nanny = tea; Dog *d = [Dog new]; b.nanny = d; //4.嬰兒發飆 [b food]; [b sleepy]; return 0; }
oc66--代理模式應用2