我们先说一个小情节
比如说我要买机票,但是我比较忙,没有时间去查询,那么我委托另一个人去给我看一下机票信息告诉我,我好做决定!
那么我委托的那个人就回去查询相关的机票信息,然后把结果反馈给我!这就形成了一个代理!让别人去给我做一件事情
我们可以如下:
//
// 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协议即可