前言
设计模式将会用 Java 来演示。
这里仅仅是个比较浅层的理解,用于快速回顾,相当于笔记。
之所以记录下代理模式,主要是因为此模式与我所探究的 java 委托 做比较
简介
代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
一个类代表另一个类的功能。
属于结构型模式。
理解
其实就是一个类去代替另一个的功能,同时还能对功能进行扩展。
代理类实现和被代理类同样的接口,在代理类中的代理方法调用被代理类的方法,这样就是实现了代理。当然可以在此基础上对被代理类进行扩展。
应用场景
一般来说是当某个对象不便于直接被访问时,就可以使用代理模式。例如主进程调用此对象代价太大,则由进程外的访问层来代替此对象的功能。
按照职责来分:(具体还不清楚)
- 远程代理。
- 虚拟代理。
- Copy-on-Write 代理。
- 保护(Protect or Access)代理。
- Cache代理。
- 防火墙(Firewall)代理。
- 同步化(Synchronization)代理。
- 智能引用(Smart Reference)代理。
实现
一个简单的图片加载示例
UML
ProxyPatternDemo
提供主函数Image
接口提供图像的行为display()
RealImage
类作为Image
的子类,是真正的图像类ProxyImage
类也继承Image
类,作用是代理RealImage
的方法。其中RealImage
作为ProxyImage
的成员变量
代码
代码示例来自菜鸟教程——代理模式
- 图像接口
1 | public interface Image { |
- 实体类
1 | public class RealImage implements Image { |
1 | public class ProxyImage implements Image{ |
- 主函数类
1 | public class ProxyPatternDemo { |
- 运行结果
1 | Loading test_10mb.jpg |
优点/缺点
优点
- 职责清晰
- 高扩展性
- 智能化
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。