结构型设计模式.代理模式

一、概念

FDA9D4BF-7477-4420-BAA3-AE079CE3A43C.png
1.1、定义

给某一个对象提供一个代理,并由「代理对象」控制对「原对象」的引用。


proxy_pattern_uml_diagram.jpg

如上图,
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的定制化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 代理简述: 代理是一个动词,动词之间会有产生关系两者。代理这个词产生关系的两者就是:realSubject(被代理...
    markfork阅读 395评论 0 3
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,259评论 4 61
  • 1 场景问题# 1.1 访问多条数据## 考虑这样一个实际应用:要一次性访问多条数据。 这个功能的背景是这样的;在...
    七寸知架构阅读 3,040评论 1 52
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,984评论 1 15
  • 这是假期最后一周了,这周的作业都完成的差不多,就是书有点少了,剩下的都完成的很好。 第八周反馈 这周的反馈做的不是...
    牛涵葳阅读 259评论 0 0