本文已参与「新人创作礼」活动,一起开启掘金创作之路。
代理模式(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
本文已参与「新人创作礼」活动,一起开启掘金创作之路。