您的位置:首页 > 其它

代理设计模式

2015-10-08 14:04 288 查看

代理设计模式

【代理模式: 】

【案例分析: 】

【代码实现: 】

【代理模式: 】

一个类A无法完成需要完成的某个方法,然后由A提供一个协议,类B遵守这个协议来代替A完成这个方法,这样的设计模式就是代理模式。使用代理模式,在A被封装好之后,需要修改它的执行方法的时候只需要对代理对象修改即可。

【案例分析: 】

有一个Jack的人,他想租一套公寓,由于工作繁忙,他没有时间去租房,因此他委托中介帮忙给他找房源找到房源就告知他,如果房租太贵Jack就委托中介继续找,知道找到合适的为止。

首先要有Person这个类,对象是Jack,Jack有一个找房子的方法,但是这个方法他不能完成,需要有中介来完成,因此还要有Agent这个类,显然,不是所有的中介都可以给Jack找房子,只有Jack委托的中介对象才可以找,这就要有一个协议来约定谁能给Jack找房子。现在我们就来实现它:

【代码实现: 】

<Person类>
//声明文件
@interface Person : NSObject
{
//实例化属性
NSString *_name;
id<LookingForApartment> _delegate;
}

//set方法

- (void)setName:(NSString *)name;
- (void)setDelegate:(id<LookingForApartment>)delegate;

//get方法

- (NSString *)name;
- (id)delegate;

//找房子

- (void)findHouse:(NSTimer *)timer;

@end

//实现文件
@implementation Person

//set方法

- (void)setName:(NSString *)name{
_name = name;
}
- (void)setDelegate:(id<LookingForApartment>)delegate{
_delegate = delegate;
}

//get方法

- (NSString *)name{
return _name;
}
- (id)delegate{
return _delegate;
}

//找房子

- (void)findHouse:(NSTimer *)timer{

int rent = [_delegate lookingForApartment];
if (rent <= 2000) {
NSLog(@"这个房租付得起,就这个了��");
[timer invalidate];
return;
}else{
NSLog(@"房租太贵,住不起,再找一个吧。。");

}

}

@end

//Person类提供的协议
#import <Person.h>
@protocol LookingForApartment <NSObject>

//Person提供一个找房子的协议
- (int)lookingForApartment;

@end

<Agent类>

//声明文件
//Agent要遵守这个协议
@interface Agent : NSObject <LookingForApartment>

//实现文件
//Agent实现这个协议提供的方法
@implementation Agent

- (int)lookingForApartment{
int rent;
NSLog(@"找到一个房子,房租是:");
scanf("%d", &rent);
return rent;
}

@end

<main.m文件>

#import "Person.h"
#import "Agent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {

//创建对象
//找房子的对象
Person *jack = [[Person alloc] init];

//中介的对象
Agent *agent = [[Agent alloc] init];

jack.name = @"jack";

//设置找房子的委托对象
jack.delegate = agent;

//jack找房子

//设置定时器,让Jack一直调用findHouse方法,直到满足条件

[NSTimer scheduledTimerWithTimeInterval:1
target:jack
selector:@selector(findHouse:)
userInfo:@""
repeats:YES];

[[NSRunLoop currentRunLoop] run];

}
return 0;
}


【运行结果: 】
2015-07-28 08:57:02.408 7-27-homework[553:20271] 找到一个房子,房租是:
8000
2015-07-28 08:57:07.357 7-27-homework[553:20271] 房租太贵,住不起,再找一个吧。。
2015-07-28 08:57:07.411 7-27-homework[553:20271] 找到一个房子,房租是:
3000
2015-07-28 08:57:13.765 7-27-homework[553:20271] 房租太贵,住不起,再找一个吧。。
2015-07-28 08:57:14.406 7-27-homework[553:20271] 找到一个房子,房租是:
2000
2015-07-28 08:57:21.258 7-27-homework[553:20271] 这个房租付得起,就这个了


【注意 : 】协议由哪个类提出的,一般放在那个类的.m文件中,协议一般不单独创建一个文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: