代理设计模式[备份]

时间:2022-04-11 10:12:41
什么是设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。


什么是代理设计模式

生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是心相印纸的代理。这其实和我们OO中的代理模式是很相似的。


代理设计模式的场合:
当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)

当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

案例:

有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人


代码实现

Baby.h

[objc] view plain copy
  1. #import <Foundation/Foundation.h>  
  2. //1.声明婴儿是一个类  
  3. @class Baby;  
  4.   
  5. //2.声明代理,写代理要帮婴儿做的事,将婴儿传给代理,注意代理格式  
  6. @protocol BabyDelegate <NSObject>  
  7.   
  8. //喂婴儿吃饭  
  9. - (void)babyEat:(Baby *)baby;  
  10. //哄婴儿睡觉  
  11. - (void)babySleep:(Baby *)baby;  
  12.   
  13. @end  
  14.   
  15. @interface Baby : NSObject  
  16.   
  17.   
  18. @property (nonatomic, assign) NSInteger hurgryValue;  
  19.   
  20. @property (nonatomic, assign) NSInteger sleepValue;  
  21.   
  22. //3.将代理作为属性,类型限定代理遵守协议  
  23. @property (nonatomic, assign) id <BabyDelegate> delegate;  
  24.   
  25. //4.声明方法,方法里调用代理,调用代理实现的协议方法,让代理帮婴儿吃饭,睡觉  
  26. //婴儿饿了要吃饭  
  27. - (void)hurgry;  
  28.   
  29. //婴儿醒了要睡觉  
  30. - (void)wake;  
  31.   
  32.   
  33.   
  34. @end  


Baby.m

[objc] view plain copy
  1. #import "Baby.h"  
  2. #import "Nurse.h"  
  3.   
  4. @implementation Baby  
  5.   
  6. //5.实现调用代理者的方法  
  7. - (void)hurgry{  
  8.       
  9. //    6.判断代理是否实现了协议中的方法  
  10.     if ([self.delegate respondsToSelector:@selector(babyEat:)]) {  
  11.         //7.如果代理实现了协议中的方法,就调用  
  12.         [self.delegate babyEat:self];  
  13.     }  
  14.       
  15. }  
  16.   
  17. - (void)wake{  
  18.     if ([self.delegate respondsToSelector:@selector(babySleep:)]) {  
  19.         [self.delegate babySleep:self];  
  20.     }  
  21.       
  22.       
  23.       
  24. }  
  25.   
  26. - (void)dealloc  
  27. {  
  28.     NSLog(@"%s",__func__);  
  29. }  
  30.   
  31. @end  

Nurse.h

[objc] view plain copy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. //8.导入代理  
  4. @protocol BabyDelegate ;  
  5.   
  6. //9.遵守代理  
  7. @interface Nurse : NSObject <BabyDelegate>  
  8.   
  9.   
  10. @end  

Nurse.m

[objc] view plain copy
  1. #import "nurse.h"  
  2. #import "Baby.h"  
  3.   
  4.   
  5. @implementation Nurse  
  6.   
  7. //10.实现协议中的方法,(喂婴儿,让婴儿吃饭,拿到婴儿才能给婴儿做事)  
  8. - (void)babyEat:(Baby *)baby{  
  9.     baby.hurgryValue += 10;  
  10.     NSLog(@"喂婴儿吃饭!饥饿值:%lu", baby.hurgryValue);  
  11.       
  12. }  
  13.   
  14. - (void)babySleep:(Baby *)baby{  
  15.     baby.sleepValue += 5;  
  16.     NSLog(@"摇婴儿睡觉!疲劳值:%lu", baby.sleepValue);  
  17. }  
  18.   
  19. - (void)dealloc  
  20. {  
  21.     NSLog(@"%s",__func__);  
  22. }  
  23.   
  24. @end  

main.m

[objc] view plain copy
  1. #import <Foundation/Foundation.h>  
  2. #import "Baby.h"  
  3. #import "Nurse.h"  
  4.   
  5.   
  6. int main(int argc, const charchar * argv[]) {  
  7.     @autoreleasepool {  
  8.           
  9.         //11.创建所需对象  
  10.         Baby *b = [[Baby alloc]init];  
  11.         Nurse *n = [[Nurse alloc]init];  
  12.           
  13.         //12.将代理对象作为接受代理者的代理  
  14.         //(让保姆作为婴儿的代理)  
  15.         b.delegate = n;  
  16.           
  17.         //设定婴儿初始饥饿值,疲劳值  
  18.         b.hurgryValue = -5;  
  19.         b.sleepValue = -5;  
  20.           
  21.         //13.接受代理者调用代理者的方法  
  22.         //(婴儿饿了,醒了,需要吃饭和哄一哄)  
  23.         [b hurgry];  
  24.         [b wake];  
  25.           
  26.           
  27.   
  28.     }  
  29.     return 0;  
  30. }  

原文地址:http://blog.csdn.net/u011619223/article/details/49104667