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)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...
随机推荐
- AESwithJCE http://www.coderanch.com/how-to/content/AES_v1.html
Using AES with Java Technology By Rags SrinivasJune 2003 In September 2000, the National Institute o ...
- constraint更新表列约束默认值
--更新约束 alter TABLE [dbo].[Sk_Recruit] drop constraint DF_Sk_Recruit_lastcommenttime go alter TABLE ...
- ADT bundle和Eclipse和Android Studio有什么区别?安卓开发该用哪个?
这三个版本的出现有一定的历史的原因:1.最开始只有eclipse+独立的adt一种开发环境,但是由于eclipe作为一种通用的ide,带来的问题太多,经常出现eclipse的版本不兼容adt的情况,或 ...
- JVM调优-Jva中基本垃圾回收算法
从不同的的角度去划分垃圾回收算法. 按照基本回收策略分 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...
- python多进程
一.多进程池 from multiprocessing import Pool import time pool = Pool(processes=3) result=[];lr=range(t);a ...
- VB6.0 读取Excel文件并返还数据集RecordSet
读取Excel文件并返还数据集RecordSet 该方法适用于.xls,.xlsx类型的文件 读取Excel文件的Function: '取得数据集 Function getRecordSetForEx ...
- 前端利器:SASS基础与Compass入门
SASS是Syntactically Awesome Stylesheete Sass的缩写,它是css的一个开发工具,提供了很多便利和简单的语法,让css看起来更像是一门语言,这种特性也被称为“cs ...
- Myeclipse加载maven
1.自带,需要将之前下好的文本加入到myeclipse中即可.windows---->preference---->Myeclipse---->MavenMyeclipse 3.将本 ...
- Log4net日志GUI配置工具
关于log4net的配置文章在园子里真的很多,但是有关GUI界面配置的文章确定太少,改写了一个以前很早的工具 以前的那个有很多的问题,这个基本的大的问题没有,可能一个小问题还是需要修改下,基本功能肯定 ...
- [ACM] poj 2456 Aggressive cows (二分查找)
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5436 Accepted: 2720 D ...