码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发————对象之间通信之代理协议

时间:2016-05-12 14:18:42      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

 一、代理实现对象间通信:

 确定谁是代理对象,谁是被代理对象。

 事件在哪里发生?谁就是被代理对象

 事件在哪里响应?谁就是代理对象

 

需求:

举例:保姆照顾小孩,当小孩脏了时给她清洁,当小孩不开心时陪玩。

被代理类 Child

 定义代理属性(id),并且此代理属性要遵守协议

 事件发生时,要调用代理属性的协议方法来响应这个事件。

 

代理类 Nanny

 要遵守协议

 实现协议方法,协议方法中的内容就是对事件做出的响应。


代理设计模式解决是程序架构上的问题,使程序架构更合理,更具扩展性,降低类与类之前的耦合性。


 需要的对象:

 代理对象:Nanny, Grandma

 被代理对象:Child

 

 流程:

 1.定义一个协议,协议中声明一些方法。

 2.定义代理类遵守协议,它就包含了协议所有方法的声明。

 3.被代理类中应该定义一个代理对象,设置类型为通用类型id<协议名> delegate;

 4.当被代理对象要完成某此它无法完成的功能时,它通知代理对象来帮助他完成,即调用代理类中实现的协议方法来完成。

 

首先设置协议类

#import <Foundation/Foundation.h>

@class Child;

//照顾小孩的协议,必须遵守这个协议才有照顾小孩的资格
@protocol CareBabyProtocol <NSObject>

//给小孩洗澡
- (void)batheChild:(Child *)child;


//逗小孩开心
- (void)playWithChild:(Child *)child;

@end

在小孩类中定义代理对象

#import "CareBabyProtocol.h"
#import <Foundation/Foundation.h>




@interface Child : NSObject


@property NSInteger cleanValue; //清洁度
@property NSInteger happyValue; //快乐度

//被代理类中应该定义一个代理对象,设置类型为通用类型id<协议名> delegate;
//小孩中拥有一个通用型(id)的代理对象,并让此对象遵守协议
@property id<CareBabyProtocol> delegate;



- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue;

@end

在小孩不干净或者不高兴的时候实现代理中的方法

#import "Child.h"


@implementation Child

- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue {
    
    self = [super init];
    
    if (self) {
        
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
        
        _cleanValue = cleanValue;
        
        _happyValue = happyValue;
        
        
    }
    
    return self;
}

- (void)timerAction:(NSTimer *)timer {
    
    _cleanValue--;
    _happyValue--;
    
    NSLog(@"clean:%li, happy:%li", _cleanValue, _happyValue);
    
    //当小孩的清洁度下降某个限定值时,通知保姆来给他洗澡
    if (_cleanValue == 95) {
        
        [self.delegate batheChild:self];
        
        
    }
    
    if (_happyValue == 90) {
        [self.delegate playWithChild:self];
    }
    
}



@end

定义代理对象保姆,并让保姆签署协议

#import "CareBabyProtocol.h"
#import <Foundation/Foundation.h>

@class Child;

@interface Nanny : NSObject <CareBabyProtocol>



@end

保姆的协议方法实现

#import "Nanny.h"
#import "Child.h"

@implementation Nanny


- (void)batheChild:(Child *)child {
    
    NSLog(@"小孩脏了,保姆把小孩洗白白");
    child.cleanValue = 100;
    
}


- (void)playWithChild:(Child *)child {
    
    NSLog(@"小孩闹人了,保姆逗他开心");
    child.happyValue = 100;
    
}

@end

在main中开启小孩对象和代理对象(保姆)

#import "Child.h"
#import "Nanny.h"
#import "Grandma.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        
        //Nanny *nanny = [[Nanny alloc] init];
        Grandma *grandma = [[Grandma alloc] init];
        
        Child *child = [[Child alloc] initWithCleanValue:100 happyValue:100];
        
        //将保姆作为小孩的代理对象
        //child.nanny = nanny;
        
        //将奶奶作为小孩的代理对象
        child.delegate = grandma;
        
        
        [[NSRunLoop currentRunLoop] run];
        
        
        
    }
    return 0;
}



iOS开发————对象之间通信之代理协议

标签:

原文地址:http://blog.csdn.net/lerryteng/article/details/51363224

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!