// // 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) int sleep; // 吃东西 - (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; }
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7437248.html,如需转载请自行联系原作者