最近想起自己当初接触OC时的对各种设计模式的不理解,到现在对于各种设计模式的运用,发现我的理解思路也许能够帮助到正在为各种设计模式发愁和不能很好的理解常用的设计模式的开发人群。首先我们先明白什么是设计模式,设计模式就是在软件开发的过程中,经常重复出现的一类问题的解决方案,目的是提高程序的可扩展性和维护性。
这篇博客带领大家理解一下代理模式:
代理模式是iOS开发中一种常见的设计模式,借助于protocol(协议)得以实现,而且Cocoa Touch框架中大量使用了这种设计模式。
何时使用代理模式?当一个对象无法直接地获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式。(界面A跳转到界面B,界面A存在指向界面B的指针,可以直接通过指针去操作界面B;但是从界面B到界面A是无法取得指向界面A的指针的,所以我们此时无法建立起界面B和界面A之间的通信,那么我们就需要用到代理模式来建立起通信。也就是说,正向的页面跳转时使用代理是没有必要的,正常情况下只有逆向的页面跳转才会使用代理设计模式,也就是我们常听说的代理逆向传值。)
代理模式解决的问题:1.解决两个对象之间的通信。2.解决两个对象之间的耦合问题,使其解耦合。
现将代理细分为六步进行讲解:
第一步:委托类中制定协议,即代理类最后需要实现的方法。
第二步:委托类中定义代理属性,存放代理对象。
第三步:为委托类指定代理对象。
第四步:代理类签署代理协议。
第五步:委托方通知代理来执行协议方法。
第六步:代理类中实现协议方法。
下面通过代码块的形式进行讲解:(我这里创建了A和B两个控制器)
第一步位置 : B.h
//********************* 第一步:委托类中制定协议(即代理类最后需要实现的方法) *********************
@protocol BCtrlDelegate <NSObject>
- (void)changeTheBackgroundColorOfACtrl:(UIColor *)color;
@end
第二步位置 : B.h
@interface B : UIViewController
//********************* 第二步:委托类中定义代理属性,存放代理对象 *********************
@property (nonatomic, weak)id<BCtrlDelegate>delegate;
@end
第三步位置 : A.m
#pragma mark - 跳转 (需要#import"B")
- (void)skipToBCtrl{
//********************* 第三步:为委托类指定代理对象 *********************
B *BCtrl =[[B alloc]init];
BCtrl.delegate = self;
[self presentViewController:BCtrl animated:YES completion:nil];
}
第四步位置 : A.m
//********************* 第四步:代理类签署代理协议 *********************
@interface A ()<BCtrlDelegate>
@end
第五步位置 : B.m
//********************* 第五步:委托方通知代理来执行协议方法 *********************
#pragma mark - 按钮的点击事件
- (void)chooseColor:(UIButton *)btn{
if ([self.delegate respondsToSelector:@selector(changeTheBackgroundColorOfACtrl:)]){
switch (btn.tag) {
case 101:
//使用代理进行调用代理方法
[self.delegate changeTheBackgroundColorOfACtrl:[UIColor grayColor]];
break;
case 102:
[self.delegate changeTheBackgroundColorOfACtrl:[UIColor greenColor]];
break;
case 103:
[self.delegate changeTheBackgroundColorOfACtrl:[UIColor redColor]];
break;
default:
break;
}
[self dismissViewControllerAnimated:YES completion:nil];
}
}
第六步位置 : A.m
//********************* 第六步:代理类中实现协议方法 *********************
#pragma mark - 实现代理方法
- (void)changeTheBackgroundColorOfACtrl:(UIColor *)color{
self.view.backgroundColor = color;
sleep(1);
if (color == [UIColor redColor]) {
[self alertView:@"背景颜色改为 红色"];
}
if (color == [UIColor grayColor]) {
[self alertView:@"背景颜色改为 灰色"];
}
if (color == [UIColor greenColor]) {
[self alertView:@"背景颜色改为 绿色"];
}
}
经过以上六步就完成了一个简单的代理传值,虽然上面讲述并传递的是UIColor,但是不论文字或者其他,通过代理的传递过程都是一样的,最主要的是理解代理设计模式实现的逻辑和作用,实践出真知,所以不太理解代理设计模式的同学,可以不断的练习,直至自己完全理解代理设计模式。
代码下载地址 :http://download.csdn.net/detail/wuzesong/9586848