您的位置:首页 > 移动开发 > IOS开发

iOS 设计模式之代理模式(Proxy)

2016-02-18 00:20 591 查看
代理模式是 iOS 开发过程中一种非常常见的模式。

小明要追求小红,但是小红不认识小明,小明就让小强帮自己送花,这就是代理模式:为其他对象提供一种代理以控制对这个对象的访问。

我的理解是,小明(追求者)决定送什么(方法实现),而小强(代理人)决定什么时候送(方法调用)。

当追求者不知道被追求者的名称时,由代理人传入名字。

实现:

//追求者小明 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: