设计模式-8-代理模式

73 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

代理模式(Proxy Pattern)就是提供一个代理对象,这个对象可以作为其他对象的代理来控制对其他对象的访问。一个类代表另一个类的功能。属于结构型模式。

按职责来划分,通常有以下使用场景:

图片

和适配器模式的区别:

    适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

和装饰器模式的区别:

    装饰器模式为了增强功能,而代理模式是为了加以控制。

一、我们搞一个简单的代理模式实现图片显示

1.图片接口及实现

package com.xing.design.proxy;
/** * 图片 * @author xing */public interface Image {/**   * 显示图片   */void display();}

实现

package com.xing.design.proxy;
/** * 真实图片 代理的对象 * @author xing */public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;    System.out.println("new一个RealImage对象 " + fileName);  }@Overridepublic void display() {    System.out.println("调用RealImage的display,显示RealImage图片:" + fileName);  }}

2.搞一个代理类来持有图片显示对象,核心代码

package com.xing.design.proxy;
/** * 代理类 * @author xing */public class ProxyImage implements Image{
/** 被代理的对象 */private RealImage realImage;/** 文件名 */private String fileName;
public ProxyImage(String fileName){this.fileName = fileName;    System.out.println("new一个ProxyImage对象 " + fileName);  }
  @Overridepublic void display() {if(realImage == null){      realImage = new RealImage(fileName);      System.out.println("调用ProxyImage的display,通过ProxyImage代理new一个realImage对象 " + fileName);    }else {      System.out.println("调用ProxyImage的display,realImage对象还存在");    }    realImage.display();  }}

3.测试

package com.xing.design.proxy;
public class ProxyPatternDemo {public static void main(String[] args) {    Image image = new ProxyImage("1.jpg");    image.display();    image.display();    System.out.println(image);  }}

结果:

图片

以后再深入学习:

静态代理

JDK动态代理

cgLib的动态代理

总结:

        代理模式就是用一个代理类来管理对象的访问。

END

本文已参与「新人创作礼」活动,一起开启掘金创作之路。