设计模式-代理模式
# 设计模式-代理模式
# 概述
当我们想要一个物品,但是因为某种原因不能购买或者购买困难的时候,我们会去寻找代购帮忙。在软件开发中也有一种设计模式可以提供与代购类似的功能。
由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个成为代理
的第三者来实现间接访问。
# 定义
当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。
代理模式: 给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
# 代理模式结构
代理模式的主要角色如下:
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
# 代理模式应用案例
1、创建图片接口
public interface Image {
void display();
}
2、创建图片实体类
public class RealImage implements Image{
private final 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);
}
}
3、创建图片代理对象
public class ProxyImage implements Image {
private RealImage realImage;
private final String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(fileName);
}
realImage.display();
}
}
4、案例实现
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
//图像将从磁盘加载
image.display();
System.out.println("");
//图像将不从磁盘加载
image.display();
}
}
# 代理模式优缺点
优点:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点:
- 代理模式会造成系统设计中类的数量增加
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度;
# 代理模式使用环境
- 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
- 当需要用一个消费资源较少的对象来代表一个消费资源较多的对象,从而降低系统开销,缩短运行时间时可以使用虚拟代理。
- 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。
- 当需要控制对一个对象的访问为不同用户提供不同级别的访问权限时可以使用保护代理。
# 参考
Java设计模式
上次更新: 2024/06/29, 15:13:44