代理设计模式

来源:互联网 发布:男士 羽绒服推荐 知乎 编辑:程序博客网 时间:2024/06/06 01:34

代理设计模式

  • 【代理模式: 】
  • 【案例分析: 】
  • 【代码实现: 】

【代理模式: 】

一个类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] 找到一个房子,房租是:80002015-07-28 08:57:07.357 7-27-homework[553:20271] 房租太贵,住不起,再找一个吧。。2015-07-28 08:57:07.411 7-27-homework[553:20271] 找到一个房子,房租是:30002015-07-28 08:57:13.765 7-27-homework[553:20271] 房租太贵,住不起,再找一个吧。。2015-07-28 08:57:14.406 7-27-homework[553:20271] 找到一个房子,房租是:20002015-07-28 08:57:21.258 7-27-homework[553:20271] 这个房租付得起,就这个了

【注意 : 】协议由哪个类提出的,一般放在那个类的.m文件中,协议一般不单独创建一个文件。

0 0
原创粉丝点击