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