一、概念
1.1、定义
给某一个对象提供一个代理,并由「代理对象」控制对「原对象」的引用。
如上图,
1、将创建一个 Image 接口和<实现 Image 接口>的实体类RealImage。
2、创建一个同样<实现实现 Image 接口>代理类ProxyImage,通过间接访问RealImage里面的图片内容,从而减少 RealImage 对象加载的内存占用。
3、我们的演示类ProxyPatternDemo,使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。
1.2、解决的问题
问题分析:有时候,我们直接访问「原对象」的接口的时,会带来的一些问题,比如说:要访问的对象在远程的机器上;比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问。
模式解决思路:抽离单独一层即代理类层,外部的请求只能到达「代理类」,然后由「代理类」负责转为对「原对象」的访问。依次来实现隔离解耦,进而实现访问控制。
二、模式的应用和优缺点
2.1、应用场景
-
实例:
- Windows 里面的快捷方式
- 火车票代理售票点
- Spring AOP
- iOS的Delegate模式
-
使用场景:
- 远程代理
- 虚拟代理
- Copy-on-Write 代理
- 保护(Protect or Access)代理
- Cache代理
- 防火墙(Firewall)代理
- 同步化(Synchronization)代理
- 智能引用(Smart Reference)代理
2.2、优缺点
- 优点:
职责清晰、高扩展性、智能化 - 缺点:
增加代理中间层,在访问速度会变慢
增加开发的工作量和难度,特别是有些对象的代理追加很麻烦。
三、思而后行
-
Java代理模式:
- 静态代理:经典模式,静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.
- 动态代理:代理对象,不需要实现接口;利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
- Cglib代理:子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。而不像动态代理和静态代理那样,要求目标对象是实现一个接口的目标对象。
iOS中UITableView的代理理解
个人认为UITableView进行反向代理应用,将UITableView作为Core进行封装,而实现协议的代理对象却扩展开放,以便实现table和cell的定制化