代理设计模式
- 【代理模式: 】
- 【案例分析: 】
- 【代码实现: 】
【代理模式: 】
一个类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文件中,协议一般不单独创建一个文件。