【设计模式】结构型-④代理模式
...大约 3 分钟
【设计模式】结构型-④代理模式
注
学习核心
- 代理模式核心
- 概念:使用代理对象(proxy object)来代替对真实对象(real object)的访问,在不修改原目标对象的基础上提供额外的功能操作,扩展目标对象的功能
- 组成:代理对象、被代理对象
- 主题(Subject):抽象主题(Abstract Subject)、真实主题(Real Subject)、代理主题(Proxy Subject)
- 抽象主题:定义了真实主题和代理主题的公共接口
- 真实主题:基础业务功能实现
- 代理主题:在不改变原有业务代码的基础上进行扩展实现
- 客户端(Client):通过抽象主题来操作真实主题或代理主题
- 主题(Subject):抽象主题(Abstract Subject)、真实主题(Real Subject)、代理主题(Proxy Subject)
- 应用场景分析
【MyBatis框架】:定义接口,通过XML配置文件或者自定义注解中的SQL语句进行CRUD操作
【中间件】:例如RPC框架,在获取到jar包对接口的描述之后,中间件会在服务启动的时候生成相应的代理类,当调用接口时实际是通过代理类发出的socket信息进行调用
JS的【图片加载】场景、图片二次处理场景:
- 缓存代理:一些网络图片交互场景下,先将图片预先加载到本地缓存中,当要进行访问的时候直接访问本地缓存信息,而不需重复从服务器中拉取;
- 虚拟代理:例如一些图片加载比较大的情况下,先用loading图片进行占位然后异步加载图片信息,待图片信息加载完成之后再刷新图片数据
- 图片二次处理场景:通过代理对图片进行二次处理(水印渲染、加解密、图片权限访问控制等)
【AOP】场景:所谓AOP面向切面编程,其底层本质也是通过代理方式实现对功能的横向扩展
学习资料
概念说明
代理模式:使用代理对象(proxy object)来代替对真实对象(real object)的访问,在不修改原目标对象的基础上提供额外的功能操作,扩展目标对象的功能。代理模式可以应用于不同的场景(如网络请求、图片加载、数据操作等)
场景案例
1.图片加载场景
目标:设定一个代理,控制对真实图片的访问(例如开关图片访问权限、图片二次处理等)
核心:定义Image接口,分别定义RealImage、ProxyImage,通过Client客户端调用抽象主题进行操作
代码实现说明
- 主题定义(抽象主题接口、真实主题、代理主题)
/**
* 抽象主题接口
* 定义真实主题和代理主题的公共接口
*/
public interface Image {
public void display();
}
/**
* 真实主题:实现抽象主题接口
*/
public class RealImage implements Image {
@Override
public void display() {
System.out.println("show real image");
}
}
/**
* 代理主题:实现抽象主题接口
* 目的:控制对真实图片的访问,例如水印渲染、加密处理等
*/
public class ProxyImage implements Image {
// 定义被代理对象
private RealImage realImage = new RealImage();
@Override
public void display() {
realImage.display();
System.out.println("show proxy image: 输出水印渲染后的图片信息");
}
}
- 客户端定义(客户端调用)
/**
* 客户端访问
*/
public class Client {
public static void main(String[] args) {
Image proxy = new ProxyImage();
proxy.display();
}
}
Powered by Waline v3.1.3