简介:所谓代理模式(Proxy Pattern),为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。这种类型的设计模式属于结构型模式。
优点:1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
概要设计:我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。
ProxyPatternDemo,我们的演示类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。
代码:
创建一个接口。
public interface Image {
void display();
}
步骤 2
创建实现接口的实体类及代理类
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
super();
this.fileName = fileName;
loadFromDisk(fileName);
}
public void display() {
System.out.println("展示名:"+fileName);
}
private void loadFromDisk(String fileName){
System.out.println("加载:"+fileName);
}
}
public class ProxyImage implements Image {
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
super();
this.fileName = fileName;
}
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
步骤 3
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
结果:
扩展:以上代码阐述的是静态代理,java的实际开发中经常运用JDK 自带的动态代理和CGLIB动态代理
应用详情参考链接