代理模式:一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
介绍
- 意图:为其他对象提供一种代理以控制对这个对象的访问。
- 主要解决问题:在直接访问对象时带来的问题,直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
- 关键代码:实现与被代理类组合。
- 优点:1、职责清晰。 2、高扩展性。 3、智能化。
- 缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
示例
以绘制 三角形、圆形、矩形功能为例:
-
定义接口
javapublic interface Draw { void circularAction(); void rectangleAction(); void triangleAction(); }
-
实现类
javapublic class RealDraw implements Draw { @Override public void circularAction() { //绘制圆形 } @Override public void rectangleAction() { //矩形 } @Override public void triangleAction() { //三角形 } }
-
代理类
javapublic class ProxyDraw implements Draw { private RealDraw realDraw; @Override public void circularAction() { if(realDraw == null){ realDraw = new RealDraw(); } realDraw.circularAction(); } @Override public void rectangleAction() { if(realDraw == null){ realDraw = new RealDraw(); } realDraw.rectangleAction(); } @Override public void triangleAction() { if(realDraw == null){ realDraw = new RealDraw(); } realDraw.triangleAction(); } }
-
使用
javapublic static void main(String[] args) { ProxyDraw proxyDraw = new ProxyDraw(); proxyDraw.circularAction(); proxyDraw.rectangleAction(); proxyDraw.triangleAction(); }