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)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...
随机推荐
- ftl文件格式化jsp形式显示
通过myeclipse设置ftl的编辑器为jsp的编辑器,达到效果. Myeclipse->windows->preferences 1\ 2\ 3\ 完成后即可.
- Selenium2+python自动化16-alert\confirm\prompt
前言 不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决. alert\confirm\prompt ...
- Selenium2+python自动化3-解决pip使用异常
一.pip出现异常 有一小部分童鞋在打开cmd输入pip后出现下面情况:Did not provide a commandDid not provide a command?这是什么鬼?正常情况应该是 ...
- 【ShaderForge】溶解测试
已支持粒子颜色的所有控制 折射效果已支持Alpha的影响(Texture必须是tga或dds带通道贴图,PNG贴图不支持折射Alpha效果的影响,其他贴图支持任何格式) 说明: SpecularC ...
- java获取系统信息
public class SystemInfo { public static void main(String[] args) { //系统属性 Properties prop = System.g ...
- 【Maven】Eclipse 使用Maven创建Java Web项目
创建环境 系统:win 10 软件:eclipse,maven 创建步骤 需求创建一个Servlet版本是3.0,Java版本是1.7的项目Maven web项目 使用eclipse工具创建maven ...
- Source Depot 使用总结
MS使用的Source Depot方案,主要是控制软件版本,类似的软件有SVN等,Source Depot一般使用起来也比较方便,可以灵活的配置,只要有访问权限,就可以下到对应的源代码文件. SD使用 ...
- css伪类运用
<!doctype html><html><head><meta charset="utf-8"><title>CSS输 ...
- php_mysqli面向对象链接数据库(一)
<?php$servername="localhost";$username="root";$password="root";$dbn ...
- android firmware 利用UDP socket发送Magic Packet--python版本
android firmware 利用UDP socket发送Magic Packet--python版本 #!/usr/bin/python import sys, time from struct ...