iOS中的代理设计模式

来源:互联网 发布:arduino 3d打印机源码 编辑:程序博客网 时间:2024/05/21 06:26

二、使用步骤

1>定义一份协议

2>B遵守协议,实现相应的方法

3>A中要定义一个代理属性id<协议>delegate

4>创建B对象,设置A的delegate对象为

相当于在A中一致在调用B中的方法,如果B这个对象为nil的话,就不执行B相应的方法,如果B对象不为空,就会执行B中的方法

程序入口:


#import <Foundation/Foundation.h>

#import "Baby.h"

#import "Dog.h"

int main(int argc,constchar * argv[])

{

    @autoreleasepool {// 2.婴儿

        Baby *b = [[Babyalloc]init];

        b.age = 1;

b.baomu = [[Dogalloc]init];

[b cry];

    }

    return 0;

}

实体类的声明:

#import <Foundation/Foundation.h>

#import "BabyBaomuXieyi.h"

@interface Baby : NSObject

@property (nonatomic,strong)id<BabyBaomuXieyi> baomu;//任何人都能做保姆,但是要遵守BabyBaomuXieyi

@property (nonatomic,assign)int age;// 年龄

- (void)hungry; //饿了

- (void)cry; // 哭了

- (void)sleep; // 想睡觉

@end

实体类的实现

#import "Baby.h"

@implementation Baby

- (void)cry

{

    NSLog(@"%d岁的baby哭了", _age);

    // 通知保姆(护士)

    [_baomu babyCry:self];

}


- (void)sleep

{

    NSLog(@"%d岁的baby想睡觉", _age);

    

    // 通知保姆

    [_baomu babySleep:self];

}


- (void)hungry

{

    NSLog(@"%d岁的baby想吃东西", _age);

    

    // 通知保姆

    [_baomu babyHungry:self];

}

@end


声明协议


#import <Foundation/Foundation.h>

@class Baby;


@protocol BabyBaomuXieyi <NSObject>

- (void)babyCry:(Baby *)baby;

- (void)babySleep:(Baby *)baby;

- (void)babyHungry:(Baby *)baby;

@end


实现代理的实体

#import <Foundation/Foundation.h>

#import "BabyBaomuXieyi.h"

@interface Dog : NSObject <BabyBaomuXieyi>


@end

实现代理相关方法

#import "Dog.h"

#import "Baby.h"


@implementation Dog

- (void)babyCry:(Baby *)baby

{

    NSLog(@"狗正在安慰%d岁的baby", baby.age);

}


- (void)babyHungry:(Baby *)baby

{

    NSLog(@"狗喂%d岁的baby吃东西", baby.age);

}


- (void)babySleep:(Baby *)baby

{

    NSLog(@"狗哄%d岁的baby去睡觉", baby.age);

}

@end


经过程序逻辑,我们可以发现,如果Baby想要找baomu,那么这个baomu就必须遵守协议,不然baomu这个对象就不会被赋值,只有遵守协议的baomu,才有照顾baby的资格。在IOS的UI中有许多的Delegate这个玩意儿,他们的总体思路就是在代码里面调用代理对象相关的方法,如果这个代理对象为nil,那么发送的消息就不会被执行,如果我们设置了代理,并且重写相关的方法,那么代理对象就会起作用。


0 0
原创粉丝点击