【原】谈谈对Objective
- 时间:
- 浏览:1
- 来源:大发快3_快3官网app下载_大发快3官网app下载
本文转载请注明出处 —— polobymulberry-博客园
1. 前言
这篇文章主可是对代理模式和委托模式进行了对比,买车人认为Objective-C中的delegate大主次用法属于委托模式。全文可是抠概念,对实际开发越来越 任何影响。
前段时间看得人的一篇博客iOS开发——从一道题看Delegate,和这篇博客iOS APP 架构漫谈处里的什么的什么的问题 相似。两篇blog都写得很不错,都在为了处里另另有四个 页面之间的数据传递什么的什么的问题 :
A页面中另另有四个 UILabel *labelA,B页面中另另有四个 UITextField *textFieldB。从A页面跳转到B页面后,更改textFieldB中数据再返回到A页面,labelA显示的将是textFieldB中更改后的数据,嗯,可是越来越 简单的另另有四个 数据传递场景。
处里有一种 什么的什么的问题 最好的法子可是,比如使用另另有四个 DAO(data access object)去维护labelA和textFieldB所对应的数据。页面的数据流向如下图可是:
可是有一种 场景都在很错综复杂,可是不须还能够引入DAO越来越 重的架构。
有事先亲们儿会陷入技术的细节不可自拔,不妨静下来想一想,有一种 什么的什么的问题 本质在哪几种?
有一种 什么的什么的问题 的难点在于页面B中textFieldB的数据变化后无法通知页面A中的labelA。将会页面B涵盖labelA的引用就好了,可是就还能够直接在页面B的代码中操作labelA。于是我在页面B中打上去了另另有四个 UILabel *labelARef,在A页面push到B页面时,将页面A的labelA赋值给labelRef即可(亲测还能够进行数据传递)。
上述最好的法子着实可行,不过亲们儿肯定都着实可是设计也是越深暴了。将会数据传递的业务比较多,越来越 页面B中就还能够引用可是页面A的属性。当然亲们儿还能够直接引用页面A作为页面B的属性,即UIViewController *vcA。如下图所示:
可是设计着实没啥什么的什么的问题 。不过亲们儿这次主题是代理模式,可是们说的有一种 什么的什么的问题 到底和代理模式有哪几种联系呢?
2.使用代理模式实现数据传递
亲们儿先看看GoF《设计模式:可复用面向软件的基础》中对代理模式的描述:为可是对象提供有一种代理以控制对有一种 对象的访问。咦,是都在和顶端有一种 什么的什么的问题 很像?为页面B提供有一种代理以控制页面A的访问,能控制页面A,那就能控制页面A中的labelA。可是顶端那种直接引用对象的最好的法子也还能够提供对有一种 对象的访问啊,为哪几种一定要通过代理呢?亲们儿来看下代理模式的UML图:
回到顶端那个案例,亲们儿还能够利用代理模式进行如下分派:
这里介绍另另有四个 小技巧,即如可辨别谁是代理 —— 直接跟Client打交道的是代理,此处Client可是ViewControllerB的textFieldB控件,可是直接打交道的可是ViewControllerB,也可是说ViewControllerB是代理。
代码如下:
// DataTransDelegate
// DataTransDelegate @protocol DataTransDelegate <NSObject> - (void)didTextFieldChanged:(UITextField *)textField; @end
// ViewControllerA
// ViewControllerA.m #import "ViewControllerA.h" #import "ViewControllerB.h" #import "DataTransDelegate.h" @interface ViewControllerA () <DataTransDelegate> @property (strong, nonatomic) UILabel *labelA; @property (strong, nonatomic) UIButton *buttonA; @end @implementation ViewControllerA - (void)viewDidLoad { [super viewDidLoad]; [self.view addSubview:self.labelA]; [self.view addSubview:self.buttonA]; [self.buttonA addTarget:self action:@selector(pushVC) forControlEvents:UIControlEventTouchUpInside]; } - (void)pushVC { ViewControllerB *vcB = [[ViewControllerB alloc] init]; vcB.delegate = self; [self.navigationController pushViewController:vcB animated:NO]; } - (void)didTextFieldChanged:(UITextField *)textField { self.labelA.text = textField.text; } - (UILabel *)labelA { if (_labelA == nil) { _labelA = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; _labelA.text = @"显示vcB中的textField内容"; } return _labelA; } - (UIButton *)buttonA { if (_buttonA == nil) { _buttonA = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; _buttonA.backgroundColor = [UIColor blueColor]; [_buttonA setTitle:@"进入vcB" forState:UIControlStateNormal]; } return _buttonA; } @end
// ViewControllerB
// ViewControllerB.h @protocol DataTransDelegate; @interface ViewControllerB : UIViewController @property (nonatomic, weak) id<DataTransDelegate> delegate; @end // ViewController.m #import "ViewControllerB.h" #import "DataTransDelegate.h" @interface ViewControllerB () <UITextFieldDelegate, DataTransDelegate> @property (strong, nonatomic) UITextField *textFieldB; @end @implementation ViewControllerB - (void)viewDidLoad { [super viewDidLoad]; [self.view addSubview:self.textFieldB]; self.textFieldB.delegate = self; } - (void)textFieldDidEndEditing:(UITextField *)textField { [self didTextFieldChanged:textField]; } - (void)didTextFieldChanged:(UITextField *)textField { [self.delegate didTextFieldChanged:textField]; } - (UITextField *)textFieldB { if (_textFieldB == nil) { _textFieldB = [[UITextField alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; _textFieldB.text = @"输入文字"; _textFieldB.backgroundColor = [UIColor redColor]; } return _textFieldB; } @end
效果如下:
3.关于代理模式误解
着实到目前为止并越来越 哪几种异样。关键是在亲们儿对Objective-C的protocol使用上,一般是结合delegate使用的。大多数亲们儿称有一种 模式是代理模式,可是着实delegate更像是有一种委托模式,而非真正意义上的代理,代理是proxy,而委托是delegate。另外,代理模式中代理和被代理者都还能够继承并实现同另另有四个 接口Subject,而亲们儿使用delegate一般只还能够让其中另另有四个 类继承并实现对应接口即可。
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有另另有四个 对象参与处里同另另有四个 请求,接受请求的对象将请求委托给可是对象来处里。着实顶端的viewControllerB涵盖了viewControllerA的引用有一种 做法可是委托模式。
比如亲们儿最为熟知的UITableView,可是另另有四个 典型的委托模式,它将tableView的中不变的主次封装起来,将总爱 变化的主次委托给用户买车人处里,可是说UITableView可是另另有四个 delegator,而遵循UITableViewDelegate的那个类可是delegate,可是亲们儿总爱 会在另另有四个 UIViewController中使用相似self.tableView.delegate = self可是的表达;
亲们儿将会会疑惑为哪几种还还能够使用UITableViewDelegate有一种 相似于Java中的interface?我买车人理解是将会可是方便统一接口,接口统一了,方便了用户,将会只还能够实现这哪几个接口就还能够了。
可是亲们儿还能够看得人最开使提到的两篇博客着实借助了Objective-C中的protocol实现了的着实是委托模式。
将会越来越 说委托模式和代理模式哪几种关系得话,着实代理模式应该否是有一种特殊的委托模式。