声明: 此文章仅限于记录学习之用 , 受限于自身水平和理解能力 , 因此结论可能是不正确的. 如果您需要学习,建议参考其他文章
介绍
代理模式是一种结构型模式, 它提供了原对象的替代品,来进行服务.并且可以对原服务进行增强.
优点
- 缓存功能, 可以对开销较大的资源进行缓存. 通过判断资源有无加载,来减少交互. 类似单例模式.
- 保护代理:可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限。
使用场景
想在访问一个类时做一些控制时可以添加中间层.
类图
示例代码
图片展示,通过代理缓存图片,不需要每次都从硬盘读取
1.图片接口
package com.demo;
public interface Image {
void display();
}
- 图片接口实现类 - 硬盘读取
package com.demo;
/**
* @author Administrator
* @version 1.0
* @description:
* @date 2023/11/2 15:21
*/
public class ImageLoadToDisk implements Image{
private String fileName;
public ImageLoadToDisk(String fileName){
this.fileName = fileName;
this.loadFromDisk(fileName);
}
private void loadFromDisk(String fileName) {
System.out.println("硬盘加载文件:"+fileName);
}
@Override
public void display() {
System.out.println("显示文件名:" + fileName);
}
}
- 图片接口实现类 - 代理读取.
原理:首次加载从硬盘中拿,并且加载到缓存中, 往后直接从缓存中加载
package com.demo;
/**
* @author Administrator
* @version 1.0
* @description:
* @date 2023/11/2 15:21
*/
public class ImageLoadProxy implements Image{
private ImageLoadToDisk imageLoadToDisk;
private String fileName;
public ImageLoadProxy(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if (imageLoadToDisk==null){
imageLoadToDisk = new ImageLoadToDisk(fileName);
}
imageLoadToDisk.display();
}
}
测试类
package com.demo;
/**
* @author Administrator
* @version 1.0
* @description:
* @date 2023/11/2 15:34
*/
public class Main {
public static void main(String[] args) {
ImageLoadProxy imageLoadProxy = new ImageLoadProxy("123.jpg");
imageLoadProxy.display();
imageLoadProxy.display();
imageLoadProxy.display();
}
}
参考资料
https://www.runoob.com/design-pattern/proxy-pattern.html
https://refactoringguru.cn/design-patterns/proxy
https://shusheng007.top/2021/09/08/proxy-pattern/