Objective-C 代理的例子

本文通过一个实例解释了Objective-C中的代理模式,描述了Person类如何通过定义协议委托Agent类来帮助寻找公寓,详细介绍了协议的创建、代理的实现以及在main函数中的应用。

假设有一个Jack的人(Person),他想租一套公寓(Apartment),由于他工作繁忙,没有时间去租房,因此,他委托中介(Agent)帮他寻找房源,找到合适的房源告知Jack。

首先创建一个Person类(写出基本属性和方法),person需要找房子,但是自己工作繁忙做不了,需要去找一个代理,因此一般就在这个类中写协议方法。然后代理人Agent遵守协议并实现协议中必须要实现的方法。然后再行完善,最后main文件里实现就可以了。

Person.h:

#import <Foundation/Foundation.h>

typedef enum {
    kHighRent,
    kLowRent,
    kMiddleRent,
}HouseRent;


@class Person;
@protocol LookingForApartment <NSObject>

-(HouseRent) findApartment:(Person *) person;

@end


@interface Person : NSObject

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) id<LookingForApartment> delegate; //代理,委托对象

-(id) initWithName: (NSString *) name andDelegate: (id<LookingForApartment>) delegate;

-(void) wantToFindApartment;

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

@end
Person.m:

#import "Person.h"

int count = 0;

@implementation Person

-(id) initWithName:(NSString *)name andDelegate:(id<LookingForApartment>)delegate
{
    self = [super init];
    if ( self ) {
        self.name = name;
        self.delegate = delegate;
    }
    
    return self;
}

-(void) startToFindApartment:(NSTimer *)timer
{
    HouseRent rent = 0;
    //安全判断,加一层保护,增加代码健壮型
    if ( [_delegate respondsToSelector:@selector(findApartment:)] ) {
        rent = [_delegate findApartment:self];
    }
    
    if ( rent == kHighRent ) {
        NSLog(@"价格太高,不要这套");
    }else if ( rent == kLowRent ) {
        NSLog(@"价格虽然低,但条件不太好");
    }else {
        NSLog(@"价格刚好,环境不错,就要这套了");
        [timer invalidate];
    }
    
    count++;
}

-(void) wantToFindApartment
{
    //创建一个定时器
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startToFindApartment:) userInfo:nil repeats:YES];
}

@end


Agent.h:

#import <Foundation/Foundation.h>
#import "Person.h"

@interface Agent : NSObject <LookingForApartment>

@end

Agent.m:

#import "Agent.h"

extern int count;

@implementation Agent

#pragma mark LookingForApartment
-(HouseRent) findApartment:(Person *)person
{
    HouseRent rent;
    if ( count == 0 ) {
        rent = kHighRent;
    }else if ( count == 1 ) {
        rent = kLowRent;
    }else {
        rent = kMiddleRent;
    }
    
    return rent;
}

@end

main.m:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Agent *agent = [[Agent alloc] init];
        Person *jack = [[Person alloc] initWithName:@"Jack"andDelegate:agent];
        
        [jack wantToFindApartment];
        
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:8]];
    }
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值