代理模式
代理模式的实质可以理解是处于安全考虑,不愿意把真实干活的对象暴露给访问者,可能真实干活的对象角色比较重要或者有权限问题等等原因,不愿意把真实干活的对象暴露给调用者,这个时候可以设计成代理模式,让调用者通过访问代理对象,而不知道具体的干活对象,这就是代理模式。当然代理对象是持有干活对象的。
例子:
显示一张图片功能:
- 创建一个接口
Image.java
public interface Image {
void display();
}
- 创建实现接口的实体类
RealImage.java
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
- 创建实现接口的代理类
ProxyImage.java
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
- 当被调用请求时,访问的是代理对象 ProxyImage,而不是真正干活的RealImage 对象
ProxyPatternDemo.java
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
- 注意:
代理类和具体干活类都实现了抽象接口image。
参考文档:
https://www.runoob.com/design-pattern/proxy-pattern.html