一、代理实现对象间通信:
确定谁是代理对象,谁是被代理对象。
事件在哪里发生?谁就是被代理对象
事件在哪里响应?谁就是代理对象
需求:
举例:保姆照顾小孩,当小孩脏了时给她清洁,当小孩不开心时陪玩。
被代理类 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; }
时间: 2024-11-04 08:03:51