代理模式(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);
}
@Override
public 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);
}
@Override
public 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