iOS中的代理设计模式

二、使用步骤

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,const char * 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,那么发送的消息就不会被执行,如果我们设置了代理,并且重写相关的方法,那么代理对象就会起作用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值