A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jack-xie 中级黑马   /  2014-10-9 16:06  /  780 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

协议的应用--代理模式
思路:有个人想看电影,需要去买票,但是人没有时间,所以需要一个代理去执行询问票价及剩余的票数
用代码实现:
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;
}

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

1 个回复

倒序浏览
绝对的好东西,必须赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马