Object-C代理模式

来源:互联网 发布:淘宝古琴哪家好 编辑:程序博客网 时间:2024/05/17 09:01

先上代码:


Baby.h文件

#import <Foundation/Foundation.h>

#import "BAOMU.h"

@interface Baby : NSObject


@property(nonatomic,assign)int age;

@property(nonatomic,weak)id<BAOMU> baomu;


- (void)cry;


- (void)sleep;


- (void)play;


@end



Baby.m文件

#import "Baby.h"

@implementation Baby


- (void)cry

{

    NSLog(@"%dbaby哭了",self.age);

    [_baomu babycry:self];     // 通知保姆,让保姆去帮助完成要做的事情

}


- (void)sleep

{

     NSLog(@"%dbaby困了",self.age);

    [_baomu babysleep:self];   // 通知保姆,让保姆去帮助完成要做的事情

}


- (void)play

{

     NSLog(@"%dbaby要出去玩",self.age);

    [_baomu babyplay:self];    // 通知保姆,让保姆去帮助完成要做的事情

}

@end



@protocol BAOMU 文件

#import <Foundation/Foundation.h>

@class Baby;

//  在这里要用前置声明的方式,防止交叉包含产生错误

@protocol BAOMU <NSObject>


- (void)babycry:(Baby*)ababy;


- (void)babysleep:(Baby*)ababy;


- (void)babyplay:(Baby*)ababy;

@end




Nurse.h文件

#import <Foundation/Foundation.h>

#import "BAOMU.h"

@interface Nurse : NSObject<BAOMU>

@end



Nurse.m文件

#import "Nurse.h"

#import "Baby.h"

@implementation Nurse


- (void)babycry:(Baby*)ababy

{

    NSLog(@"护士安慰%d岁的baby",ababy.age);

}


- (void)babysleep:(Baby*)ababy

{

    NSLog(@"护士哄%d岁的baby睡觉",ababy.age);

}


- (void)babyplay:(Baby*)ababy

{

    NSLog(@"护士陪%d岁的baby",ababy.age);

}

@end


到底谁才能成为Baby的代理呢,必须要能够帮助Baby完成一些事,那么又如何保证一个代理一定就能帮助Baby完成一些事呢

这里就需要声明一个协议,协议里面声明了一些方法可以帮助Baby完成"一些事",要成为Baby的协议就必须遵循这个协议,并且实现协议里面的方法,

这样就保证了每个代理都能够帮助Baby完成一些事,因为这里只要能够帮助Baby做一些事情的对象都可以做Baby的代理,

所以将Baby的代理声明为 id 类型的.


main()函数测试:

#import <Foundation/Foundation.h>

#import "Baby.h"

#import "Nurse.h"

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

{


    @autoreleasepool {

        Nurse* nurse = [[Nurse allocinit];

        Baby* baby = [[Baby allocinit];

        baby.age =2;

        [baby setBaomu:nurse];

        [baby cry];

        [baby sleep];

        [baby play];

    }

    return 0;

}

运行结果如下:

这里Baby没有显示的调用协议里面的方法,而代理却时时刻刻的监听到了Baby的动作,

baby 哭了,  代理自动调用   - (void)babycry:(Baby*)ababy 方法;

baby 困了,  代理自动调用   - (void)babysleep:(Baby*)ababy 方法;

baby 要出去玩 , 代理自动调用   - (void)babyplay:(Baby*)ababy  方法;

这就是代理的功能!

1 0
原创粉丝点击