协议的应用--代理模式
思路:有个人想看电影,需要去买票,但是人没有时间,所以需要一个代理去执行询问票价及剩余的票数
用代码实现:
1.创建一个人的类,方法:买票
2.创建一份协议,在协议中声明两个方法 询问票价和剩余的票数
3.创建两个代理的类,让代理类遵守协议 然后在代理类.m 文件中实现协议中声明的方法
4.回到人的.h 文件中声明一个代理的属性 重点id类型 遵守协议
5.在人的.m 文件中让代理的属性调用方法实现买票的功能
6.在主函数中,创建三个对象,调用方法实现买票
// 1.创建一个人的类,方法:买票
#import <Foundation/Foundation.h>
#import "TicketProtocol.h"
@interface Person : NSObject
// 买票的方法
-(void)buyTicket;
// 4.回到人的.h 文件中声明一个代理的属性 重点id类型 遵守协议
// 创建一个代理的属性 在实现方法中让delegate这个属性去调用方法实现买票 但实现人代理的对象必须要遵守<TicketProtocol>协议
@property (nonatomic,strong) id<TicketProtocol> delegate;
@end
// 2.创建一份协议,在协议中声明两个方法 询问票价和剩余的票数
#import <Foundation/Foundation.h>
@protocol TicketProtocol <NSObject>
// 协议 声明两个方法
-(int)TicketPrice;// 票价
-(int)remainingTicket;// 剩余票数
@end
// 3.创建两个代理的类,让代理类遵守协议 然后在代理类.m 文件中实现协议中声明的方法
// 第一个代理的类
#import <Foundation/Foundation.h>
#import "TicketProtocol.h"
@interface Agent : NSObject<TicketProtocol>// Agent类遵守<TicketProtocol>协议
@end
#import "Agent.h"
@implementation Agent
// 实现协议中声明的两个方法
-(int)TicketPrice{
return 100;
}
-(int)remainingTicket{
return 5;
}
@end
// 第二个代理的类
#import <Foundation/Foundation.h>
#import "TicketProtocol.h"
@interface OtherAgent : NSObject <TicketProtocol>// OtherAgent类遵守<TicketProtocol>协议
@end
#import "OtherAgent.h"
@implementation OtherAgent
// 实现协议中声明的两个方法
-(int)TicketPrice{
return 80;
}
-(int)remainingTicket{
return 50;
}
@end
// 5.在人的.m 文件中让代理的属性调用方法实现买票的功能
#import "Person.h"
@implementation Person
// 实现买票
-(void)buyTicket{
int price = [_delegate TicketPrice];
int remaining = [_delegate remainingTicket];
NSLog(@"票价:%i,剩余票数:%i",price,remaining);
}
@end
// 6.在主函数中,创建三个对象,调用方法实现买票
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建三个对象 一个人对象 两个代理对象
Person *person1 = [[[Person alloc] init] autorelease];
Agent *agent1 = [[[Agent alloc] init] autorelease];
OtherAgent *otherAgent1 = [[OtherAgent alloc] init];
// 将agent1 赋值个人的属性delegate
person1.delegate = agent1;
[person1 buyTicket];// 实现人买票 代理agent1去执行
// 将otherAgent1 赋值个人的属性delegate
person1.delegate = otherAgent1;
[person1 buyTicket];// 实现人买票 代理otherAgent1去执行
// 释放对象
[otherAgent1 release];
}
return 0;
} |