protocol小解(三)之代理设计

本文通过一个机票查询的实例,详细介绍了如何在Objective-C中使用代理模式,并进一步讲解了如何利用协议来增强代理模式的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先说一个小情节

比如说我要买机票,但是我比较忙,没有时间去查询,那么我委托另一个人去给我看一下机票信息告诉我,我好做决定!

那么我委托的那个人就回去查询相关的机票信息,然后把结果反馈给我!这就形成了一个代理!让别人去给我做一件事情

我们可以如下:

//
//  User.h
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

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

@interface User : NSObject

@property (nonatomic,strong)CompnanyA *delegate;//代理,替用户做一些事情

/**
 *  买票
 */
- (void)byATicket;

@end
//
//  User.m
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import "User.h"

@implementation User

- (void)byATicket{
    int number = [self.delegate searchNumberOfRemainTicket];
    CGFloat price = [self.delegate searchPriceOfTicket];
    
    NSLog(@"查询的票价是 %f 剩余票数是 %d",price,number);
}
@end

//
//  CompnanyA.h
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface CompnanyA : NSObject

/**
 *  查询票价
 *
 *  @return 票价
 */
- (CGFloat)searchPriceOfTicket;

/**
 *  查询剩余票数
 *
 *  @return 剩余票数
 */
- (int)searchNumberOfRemainTicket;

@end
//
//  CompnanyA.m
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import "CompnanyA.h"

@implementation CompnanyA

-(int)searchNumberOfRemainTicket{
    return 100;
}

-(CGFloat)searchPriceOfTicket{
    return 300;
}

@end

//
//  main.m
//  OCStudy
//
//  Created by LiuMingchuan on 15/9/24.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "CompnanyA.h"
#import "User.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        
        User *user = [[User alloc]init];//用户
        CompnanyA *companyA = [[CompnanyA alloc]init];//代理对象
        
        user.delegate = companyA;//设定代理
        
        [user byATicket];//买票
        
    }

    return 0;
}

输出:

2015-10-04 01:56:10.945 OCStudy[2678:1840134] 查询的票价是 300.000000 剩余票数是 100

虽然我们上面最终实现了我们想要的结果,但是当我们更换为另一个代理的时候,我们的代码需要改动很多地方

修改User类的代理代码等

我们看到User想要的代理无非要实现票价查询和剩余票数查询的功能,那么我们可以将他们封装为一个协议

//
//  UserByTicketDelegate.h
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol UserByTicketDelegate <NSObject>

/**
 *  查询票价
 *
 *  @return 票价
 */
- (CGFloat)searchPriceOfTicket;

/**
 *  查询剩余票数
 *
 *  @return 剩余票数
 */
- (int)searchNumberOfRemainTicket;

@end

我们继续修改我们的User类

//
//  User.h
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol UserByTicketDelegate;//协议提前声明

@interface User : NSObject

@property (nonatomic,strong)id<UserByTicketDelegate> delegate;//代理为遵循了<span style="font-family: Arial, Helvetica, sans-serif;">UserByTicketDelegate的任何对象</span>


/**
 *  买票
 */
- (void)byATicket;

@end
//
//  User.m
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import "User.h"
#import "UserByTicketDelegate.h"//引入协议

@implementation User

- (void)byATicket{
    int number = [self.delegate searchNumberOfRemainTicket];
    CGFloat price = [self.delegate searchPriceOfTicket];
    
    NSLog(@"查询的票价是 %f 剩余票数是 %d",price,number);
}
@end


//
//  CompanyB.h
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

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

@interface CompanyB : NSObject<UserByTicketDelegate>

@end
//
//  CompanyB.m
//  OCStudy
//
//  Created by LiuMingchuan on 15/10/4.
//  Copyright © 2015年 LMC. All rights reserved.
//

#import "CompanyB.h"

@implementation CompanyB 

- (CGFloat)searchPriceOfTicket{
    return 500;
}

-(int)searchNumberOfRemainTicket{
    return 400;
}
@end


输出:

2015-10-04 02:52:31.992 OCStudy[2755:2011210] 查询的票价是 500.000000 剩余票数是 400

这样无论我们的代理怎么变,我们不需要修改User类,只要我们的代理遵循了UserByTicketDelegate协议即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值