黑马程序员_代理模式案例

来源:互联网 发布:战地1枪械数据网站 编辑:程序博客网 时间:2024/06/08 10:00



  ------- IOS培训、<a href="http://www.itheima.com" target="blank”>Mac、期待与您交流! —————


1.       设计原理

Ø   有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做

 

2.       设计原则

Ø   首先得拥有某个代理对象属性

Ø   其次要很清楚代理有哪些方法

Ø   最后要保证能解耦

 

3.       实现方案

Ø   定义一个protocol,在其中声明一些和代理沟通的方法

Ø   拥有一个代理属性id<protocol>delegate

Ø   让代理遵守protocol


    声明代理协议

   --TicketDelegate.h--

// 声明一些跑腿方法

@protocol TicketDelegate <NSObject>

// 返回票价

- (double) ticketPrice;

// 还剩多少张票

- (int) leftTicketsNumber;

@end


--Person.h--

#import <Foundation/Foundation.h>

#import "TicketDelegate.h"

@interface Person : NSObject

- (void) buyTicket;

// 拥有一个代理属性

// id代表代理的类名随便

// 但必须遵守TicketDelegate协议

@property (nonatomicretainid<TicketDelegate> delegate;

@end


--Person.m--

#import "Person.h"

@implementation Person

// 买电影票

- (void)buyTicket

{

    // 叫代理去帮自己买票(询问一下票价、询问一下票的剩余张数)

    double price = [_delegate ticketPrice];

    int number =  [_delegate leftTicketsNumber];

    NSLog(@"通过代理的帮忙,票价=%f,还剩%d张票", price, number);

}

- (void)dealloc

{

    [_delegate release];

    [super dealloc];

}

@end


--Agent.h--

#import <Foundation/Foundation.h>

#import "TicketDelegate.h"

@interface Agent : NSObject <TicketDelegate>

@end


--Agent.h--

#import "Agent.h"


@implementation Agent

// 剩余的票数

- (int)leftTicketsNumber

{

    // ... 亲自跑电影院\或者打电话

    return 1;

}

// 每一张票多少钱

- (double)ticketPrice

{

    // ... 亲自跑电影院\或者打电话

    return 1000;

}

@end


--Main.m--

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Agent.h"

#import "NextAgent.h"


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

{

    @autoreleasepool {

        Person *p = [[[Person allocinitautorelease];

        

        Agent *a = [[[Agent allocinitautorelease];

        

        p.delegate = a;

        

        [p buyTicket];

    }

    return 0;

}






0 0