iOS开发-代理模式
代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类。两者都可以控制类的访问,访问代理的方法A也就意味着访问对象的方法A,访问委托对象方法A执行的是可以是对象的方法B。从实际开发的角度看,委托属于代理模式的扩大版,并没有那么多的限制。
基础知识
代理模式相对比较简单,可以简单的看一下UML类图:
代理模式以便管理客户对对象的访问,管理访问的方式有很多种。远程代理管理客户和远程对象之间的交互,虚拟代理控制方式实例开销大的对象,代理模式和装饰者模式有点相似,装饰者模式为对象加上行为,代理模式控制对另一个对象的访问。
实战研究
我们就根据上面的UML的类图写一个比较常规的例子,先定义定义Subject:
@protocol SubjectProtocol<NSObject> -(void)displayImage; @end @interface Subject : NSObject<SubjectProtocol> @end
Proxy中的subject属性相当于UML中的delegate指向了真实对象的引用:
@interface SubjectProxy() @property (strong,nonatomic) Subject *subject; @property (strong,nonatomic) NSString *fileName; @end @implementation SubjectProxy -(instancetype)initWithFileName:(NSString *)fileName{
self=[super init];
if (self) {
self.fileName=fileName;
}
return self;
} -(void)displayImage{
if (!self.subject) {
self.subject=[[RealSubject alloc]initWithFileName:self.fileName];
}
[self.subject displayImage];
} @end
RealSubject的实现:
@interface RealSubject() @property (strong,nonatomic) NSString *fileName; @end @implementation RealSubject -(instancetype)initWithFileName:(NSString *)fileName{
self=[super init];
if (self) {
self.fileName=fileName; }
return self;
} -(void)loadFromDisk{
NSLog(@"Loading--%@",self.fileName);
} -(void)displayImage{
NSLog(@"Display--%@",self.fileName);
} @end
调用:
Subject *sub=[[SubjectProxy alloc]initWithFileName:@"博客园-FlyElephant"];
Subject *proxy=[[SubjectProxy alloc]initWithFileName:@"Book"];
[sub displayImage];
[proxy displayImage];
输出:
2016-01-19 08:22:28.305 iOS[24822:5266030] Display--博客园-FlyElephant
2016-01-19 08:22:28.305 iOS[24822:5266030] Display--Subject---Book
iOS开发中我们对委托用的比较多,理解代理模式也很容易,代理在Objective-C中有一种更重要的例子是用于引用计数指针对象,当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
关于iOS中的委托如果不熟悉可以参考本文之前的iOS开发-委托实战~
iOS开发-代理模式的更多相关文章
- ios delegate 代理模式 观察者模式 不同视图间的通信
delegate,在ios中比比皆是,NSURLConnection(网络请求有),tableView, connectionView,等系统自带 的常见代理.甚至,自己写代码的时候,随意间敲打出了p ...
- iOS开发-命令模式
命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...
- iOS开发-工厂模式
工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式.简单工厂模式(simple factory)是类的创建模式,静态工厂方法(static factory me ...
- iOS开发-状态模式
状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...
- iOS开发-迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...
- iOS开发——工厂模式
工厂模式很好用,为表诚意,我直接搞个实用的例子放这,解析一个订单的数据,并且这个订单里面可能不止一件商品的做法. 还是直接上代码,不懂的地方,再提出来. 1.在MyOrderDeals.h文件中 #i ...
- iOS开发——代理与block传值
一.代理传值的方法 1.Hehe1ViewController.h中 #import <UIKit/UIKit.h> @protocol Hehe1ViewControllerDelega ...
- iOS开发-模板方法模式
模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一 ...
- iOS开发-策略模式
策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...
随机推荐
- decimalFormat("#","##0.00") java
importjava.text.DecimalFormat; publicclassTestNumberFormat{ publicstaticvoidmain(String[]args){ doub ...
- to_char 详解
对TO_CHAR的讨论可以分为从两种类型的数据到字符的转换:DATE和NUMBER. TO_CHAR函数返回VARCHAR2数据类型的值. 1. NUMBER TO CHAR 语法: TO_CHAR( ...
- python中的system函数与编码
在调用os.system执行命令时,发现system不能接受unicode的命令.那么命令中却又包含以unicode表示的中文等字符怎么办? ——方法就是将unicode转化为utf8 path = ...
- [原创][LaTex]LaTex学习笔记入门
0. 简介 LaTEX(/ˈlɑːtɛx/,常被读作/ˈlɑːtɛk/或/ˈleɪtɛk/),文字形式写作LaTeX,是一种基于TEX的排版系统,由美国电脑学家莱斯利·兰伯特在20世纪80年代初期开发 ...
- 如何MSHTML命名空间解析HTML文件(MSHTML::IHTMLDocument2Ptr 提示错误)
1.创建Win32或MFC工程. 2.在预编译或需要使用MSHTML命名空间的头文件中添加以下语句: #include <atlbase.h> #include <Mshtml ...
- WebStorm常用设置和常用快捷键
今天下载了最新版本的WebStorm 7.反正又要重新设置一番了,干脆写下来记录到博客里面,免得以后每次忘了还要到处搜索比较麻烦. 加速 禁用多余的插件,关掉没必要的代码检查项.webstorm慢的原 ...
- iOS AFNetworking “Request failed: unacceptable content-type: text/html”问题
使用AFNetworking出现报错: error=Error Domain=com.alamofire.error.serialization.response Code=-1016 "R ...
- 用c语言写的简单计算器
这是自己在学习C语言,凭借自己的兴趣,将课本的知识运用后整理的关于C语言计算器的代码.计算器实现的功能有:加.减.乘.除.求余.功能简单,但对于初学者的我来说能把它写出来,排除每个错误依旧是个难题.前 ...
- JS-for中的i
var aBtn = document.getElementsByTagName('input'); for( var i=0; i<aBtn.length; i++ ){ ...
- Jade之Extends
Extends jade允许多个jade文件继承一个jade文件. jade: //- layout.jade doctype html html head block title title Def ...