iOS 设计模式之代理模式(Proxy)
2016-02-18 00:20
591 查看
代理模式是 iOS 开发过程中一种非常常见的模式。
小明要追求小红,但是小红不认识小明,小明就让小强帮自己送花,这就是代理模式:为其他对象提供一种代理以控制对这个对象的访问。
我的理解是,小明(追求者)决定送什么(方法实现),而小强(代理人)决定什么时候送(方法调用)。
当追求者不知道被追求者的名称时,由代理人传入名字。
实现:
挺有意思,诶哥们儿,帮我送花给那个女孩。
小明当然认识小强,所以 import 了 Proxy.h。
而小强:
小强显然得知道小红的名字,不然怎么送花,所以要 import Schoolgirl 类。
小强有一个协议:IGiveGift,其中有三个方法,@required 的方法是实现协议的类(即小明)必须实现的,@optional 的方法则是可实现也可不实现的。
小强:看吧,我可以做的事儿有这些。
两个 if 语句是为了判断 _delegate 是否有实现方法,因为后两个方法是可选择实现的,而第一个方法不需要 if 语句,因为它是 _delegate 必须实现的。
当然还有一个 SchoolGirl类,只添加了一个 Nsstring 的 property,这里就不费篇幅了。
viewController 里添加一个 button,点按方法:
点按 button ,输出为:
2016-02-18 00:20:57.016 Proxy[16445:3388244] 送娃娃给 小红
2016-02-18 00:20:57.016 Proxy[16445:3388244] 送花给 小红
2016-02-18 00:20:57.016 Proxy[16445:3388244] 送巧克力给 小红
实例地址:https://github.com/clairehu7/DesignPatterns(04Proxy)
小明要追求小红,但是小红不认识小明,小明就让小强帮自己送花,这就是代理模式:为其他对象提供一种代理以控制对这个对象的访问。
我的理解是,小明(追求者)决定送什么(方法实现),而小强(代理人)决定什么时候送(方法调用)。
当追求者不知道被追求者的名称时,由代理人传入名字。
实现:
//追求者小明 Proxy.h #import "Proxy.h" @interface Pursuit : NSObject<IGiveGift> @end
//追求者小明 Proxy.m #import "Pursuit.h" @implementation Pursuit #pragma mark - IGiveGift - (void)giveDollsTo:(NSString *)name { NSLog(@"送娃娃给 %@",name); } - (void)giveFlowersTo:(NSString *)name { NSLog(@"送花给 %@",name); } - (void)giveChocolateTo:(NSString *)name { NSLog(@"送巧克力给 %@",name); } @end
挺有意思,诶哥们儿,帮我送花给那个女孩。
小明当然认识小强,所以 import 了 Proxy.h。
而小强:
//代理人小强 Proxy.h #import <Foundation/Foundation.h> #import "SchoolGirl.h" @protocol IGiveGift <NSObject> @required - (void)giveDollsTo:(NSString *)name; @optional - (void)giveFlowersTo:(NSString *)name; - (void)giveChocolateTo:(NSString *)name; @end @interface Proxy : NSObject @property (nonatomic,strong) id<IGiveGift> delegate; - (void)doProxyWithGirl:(SchoolGirl *)girl ; @end
小强显然得知道小红的名字,不然怎么送花,所以要 import Schoolgirl 类。
小强有一个协议:IGiveGift,其中有三个方法,@required 的方法是实现协议的类(即小明)必须实现的,@optional 的方法则是可实现也可不实现的。
小强:看吧,我可以做的事儿有这些。
//代理人小强 Proxy.m #import "Proxy.h" @implementation Proxy - (void)doProxyWithGirl:(SchoolGirl *)girl { [_delegate giveDollsTo:girl.name]; if ([_delegate respondsToSelector:@selector(giveFlowersTo:)]) { [_delegate giveFlowersTo:girl.name]; } if ([_delegate respondsToSelector:@selector(giveChocolateTo:)]) { [_delegate giveChocolateTo:girl.name]; } } @end
两个 if 语句是为了判断 _delegate 是否有实现方法,因为后两个方法是可选择实现的,而第一个方法不需要 if 语句,因为它是 _delegate 必须实现的。
当然还有一个 SchoolGirl类,只添加了一个 Nsstring 的 property,这里就不费篇幅了。
viewController 里添加一个 button,点按方法:
- (IBAction)startBtnTUI:(UIButton *)sender { Pursuit *ming = [[Pursuit alloc]init]; Proxy *qiang = [[Proxy alloc]init]; qiang.delegate = ming;//代理人qiang 的被代理人是 ming SchoolGirl *hong = [[SchoolGirl alloc]init]; hong.name = @"小红"; [qiang doProxyWithGirl:hong]; }
点按 button ,输出为:
2016-02-18 00:20:57.016 Proxy[16445:3388244] 送娃娃给 小红
2016-02-18 00:20:57.016 Proxy[16445:3388244] 送花给 小红
2016-02-18 00:20:57.016 Proxy[16445:3388244] 送巧克力给 小红
实例地址:https://github.com/clairehu7/DesignPatterns(04Proxy)
相关文章推荐
- 三种iOS应用程序用户数据存储方法
- iOS 内存管理
- Iphone开发之音频101(part 3):程序实现播放音频
- Iphone开发之音频101(part 2):转换和录音
- iOS开发之手势识别汇总
- iOS KVC详细讲解
- iOS KVO概述
- iOS 中的 NSTimer
- iOS开发之NSTimer使用初探
- iOS学习----------图片的简单处理(2)
- iOS学习----------图片的简单处理(1)
- iOS开发之保存照片到自己创建的相簿
- iOS开发之保存照片到系统相册(Photo Album)
- iOS7之后如何正确隐藏状态栏
- iOS学习----------详解FFMPEG API
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
- Nagios远程监控windows方案补充说明
- IOS开发中的几种设计模式介绍
- iOS基本设计模式
- iOS实现View镂空效果