代理设计模式

代理设计模式

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

一个类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文件中,协议一般不单独创建一个文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值