写在前面
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。当然设计模式和语言没有关系,它是一种编程思想。本篇将介绍代理设计模式的实现,以OC语言为例。
详细内容
对代理设计模式的理解
- 在OC中,代理也称为委托。意思是自己不能完成或不愿意完成的事情,让别人去做。比如,你需要去买一设计模式的书,但是自己不方便,这是你想到了你的朋友小明,请他去。这就体现了代理的思想。
- 在上面的例子中有重要的概念需要区分
- 代理类(委托方):提出需求的一方 – 你
- 实体类(代理方):可以完成委托方提出的需求的一方 - 小明
- 传递的参数:钱
- 结果:你获取的书
代理设计模式的UML类图关系
通过一个UML图形理解代理。
小例子
这里通过一个自定义控件,内部封装了一个UIButton,使用代理方式响应按钮的点击。
- 定义协议,完成双方的约束
@class GYProxyView;
/**
* 协议规范了代理类和实体类的相关要求
*/
@protocol GYProxyViewDelegate <NSObject>
@optional
-(void)proxyView:(GYProxyView *)proxyView didClickLoginBtn:(UIButton *)btn;
@end
- 代理类,若引用实体类对象,向实体类对象提出需求
@protocol GYProxyViewDelegate;
@interface GYProxyView : UIView
/** 视图的代理,这样需要为若引用*/
@property (nonatomic, weak) id<GYProxyViewDelegate> delegate;
@end
- 实体类,遵守协议,提供需求
完整代码请到这里
-(void)proxyView:(GYProxyView *)proxyView didClickLoginBtn:(UIButton *)btn
{
NSLog(@"%s", __func__);
}
- 代理的内存分析
在示例代码中,我们使用weak修饰了代理属性,这是避免循环引用的一种方式。若使用strong,则会造成循环引用。看看下图
使用weak后就成了如下图:
就避免了循环引用。
总结
今天主要讲述了代理的简单使用,希望对大家有所帮助。
若大家发现错误,欢迎指正。共同交流,共同进步!谢谢阅读!