什么是设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
什么是代理设计模式
生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是心相印纸的代理。这其实和我们OO中的代理模式是很相似的。
代理设计模式的场合:
当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
案例:
有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人
代码实现
Baby.h
[objc] view plain copy
- #import <Foundation/Foundation.h>
-
- @class Baby;
-
-
- @protocol BabyDelegate <NSObject>
-
-
- - (void)babyEat:(Baby *)baby;
-
- - (void)babySleep:(Baby *)baby;
-
- @end
-
- @interface Baby : NSObject
-
-
- @property (nonatomic, assign) NSInteger hurgryValue;
-
- @property (nonatomic, assign) NSInteger sleepValue;
-
-
- @property (nonatomic, assign) id <BabyDelegate> delegate;
-
-
-
- - (void)hurgry;
-
-
- - (void)wake;
-
-
-
- @end
Baby.m
[objc] view plain copy
- #import "Baby.h"
- #import "Nurse.h"
-
- @implementation Baby
-
-
- - (void)hurgry{
-
-
- if ([self.delegate respondsToSelector:@selector(babyEat:)]) {
-
- [self.delegate babyEat:self];
- }
-
- }
-
- - (void)wake{
- if ([self.delegate respondsToSelector:@selector(babySleep:)]) {
- [self.delegate babySleep:self];
- }
-
-
-
- }
-
- - (void)dealloc
- {
- NSLog(@"%s",__func__);
- }
-
- @end
Nurse.h
[objc] view plain copy
- #import <Foundation/Foundation.h>
-
-
- @protocol BabyDelegate ;
-
-
- @interface Nurse : NSObject <BabyDelegate>
-
-
- @end
Nurse.m
[objc] view plain copy
- #import "nurse.h"
- #import "Baby.h"
-
-
- @implementation Nurse
-
-
- - (void)babyEat:(Baby *)baby{
- baby.hurgryValue += 10;
- NSLog(@"喂婴儿吃饭!饥饿值:%lu", baby.hurgryValue);
-
- }
-
- - (void)babySleep:(Baby *)baby{
- baby.sleepValue += 5;
- NSLog(@"摇婴儿睡觉!疲劳值:%lu", baby.sleepValue);
- }
-
- - (void)dealloc
- {
- NSLog(@"%s",__func__);
- }
-
- @end
main.m
[objc] view plain copy
- #import <Foundation/Foundation.h>
- #import "Baby.h"
- #import "Nurse.h"
-
-
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
-
-
- Baby *b = [[Baby alloc]init];
- Nurse *n = [[Nurse alloc]init];
-
-
-
- b.delegate = n;
-
-
- b.hurgryValue = -5;
- b.sleepValue = -5;
-
-
-
- [b hurgry];
- [b wake];
-
-
-
- }
- return 0;
- }
原文地址:http://blog.csdn.net/u011619223/article/details/49104667