总结 ﹣ 代理设计模式

注 : 文章不断更新,转载文章请加上作者

1 . 什么是(代理模式)?
2 . 为什么要有这种(代理模式)设计思想?
3 . (代理模式)这种设计模式是怎么样的?



-> 开发中,尽量不建议用父子关系来描述层次结构.
//利用superview 找到父控件, 这样写代码扩展性不好,假如层次关系改变,这句代码就坏了.
//以后层次结构改变.有可能就变成self.superview.superview 等等去找父层
[self.superview addSubview:label] 



-->  同样的代码,不能利用父子关系关系去描述层次结构的时候,想拿到父层怎么办?
有这样一种思想: 自己创建一个属性去描述父层,(也就是将其他类,控制器等指向自己中的某一个属性, 用这个属性代表其他类,或者某个控制器)

//定义一个属性,去描述某个控制器
@property (nonatomic, weak) UIView *mainView;

//调用自己的属性mainView, 去控制那个控制器的东西
[self.mainView addSubview:label] ;




---> 上面的设计方法并不好 ,  不好的地方在于.
  * 代码耦合性太强 : 两个类的东西,都分离不开了, 因为self自己的某个属性是其他类,那么
假如这个(控制器)没有了, 那么自己的mainView属性也空了, 整套代码就是废的.

又有一种思想,将自定义view的中的某个成员作为属性描述:

//将内部控制作为自定义View的一个属性
@property (weak, nonatomic) IBOutlet UIButton *downloadBtn;
//然后利用addTarget方法,为这个属性添加监视器.
[myView.downloadBtn addTarget:self action:@selector(download:) forControlEvents:UIControlEventTouchUpInside];




上面的代码,固然也可以实现了,自定义的view拿到 其他类,控制器的view,
---> 上面的设计方法同样并不好 ,  不好的地方在于.
* 自己的控件不应该拿出来,让别人监听 --> [myView.downloadBtn addTarget:self action:@selector(download:) forControlEvents:UIControlEventTouchUpInside];
自己的按钮不应该拿出来让控制器去监听


* 这个自定义的view将自己内部的控件暴露了出来 , 谁用了这个控件,假如有一天这个自定义的view不在了, 这个属性也不在了,那么谁用了这个属性,谁的代码就废了





其实就是, 一个自定义的View里面有个按钮,然后点击这个按钮,让其他的控制器,或者其他的View去做事情的时候,就需要用代理   --谁适合做得事情,就应该交给谁去做(代理)

1. 当一个对象想监听另外一个对象的状态和里面发生了什么,用代理
2. 或者说一个对象或者一个控件内部发生状态的改变想通知其他对象或者控件用代理






设计原则:
*******  1. 一个独立的自定义view,不能跟控制器有半点联系
*******  2. 自定义的view,不应该将自己内部的东西暴露出来
*******  3. 谁适合做得事情,就应该交给谁去做(代理)


细节:
*******  1. 协议名称一定要以控件名开头
*******  2. 协议方法建议加上@optional, 方法可选
*******  3. 代理方法建议用view开头







猜你喜欢

转载自cwlong.iteye.com/blog/2230206