代理模式Image Proxies(一、最朴素实现)
代理模式在软件设计模式中是一种常用的技术,它允许我们在访问或操作某个对象时,通过一个中介对象(代理)来进行,从而增加了灵活性和控制性。在本文中,我们将探讨代理模式的最朴素实现,并通过Java代码示例进行讲解。 代理模式的核心思想是为一个对象提供一个替代品或占位符,以便控制对原对象的访问。这可以用于添加额外的功能,如缓存、日志记录、权限控制等,而不会改变原始对象的接口。在Java中,我们可以通过继承、接口或者动态代理来实现代理模式。 1. 继承实现: 在这个最朴素的实现中,我们可以创建一个代理类,该类继承自目标对象的类。这样,代理类就可以直接调用目标对象的方法,同时在调用前后添加额外的操作。 ```java // 目标对象 public class Image { public void display() { // 图片显示逻辑 } } // 代理对象 public class ProxyImage extends Image { private Image target; public ProxyImage(Image target) { this.target = target; } @Override public void display() { // 额外操作,如加载前的预处理 preProcess(); target.display(); // 加载后的后处理 postProcess(); } private void preProcess() { // 预处理逻辑,如检查权限、加载缓存等 } private void postProcess() { // 后处理逻辑,如统计展示次数等 } } ``` 2. 接口实现: 如果目标对象实现了某个接口,我们也可以创建一个代理类实现相同的接口,然后在代理类中持有目标对象的引用,通过调用目标对象的方法来实现功能。 ```java // 定义接口 public interface Image { void display(); } // 目标对象 public class RealImage implements Image { @Override public void display() { // 图片显示逻辑 } } // 代理对象 public class ProxyImage implements Image { private Image target; public ProxyImage(Image target) { this.target = target; } @Override public void display() { // 额外操作 preProcess(); target.display(); // 后续操作 postProcess(); } private void preProcess() { // 预处理逻辑 } private void postProcess() { // 后处理逻辑 } } ``` 3. 动态代理(JDK代理): Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了动态代理的能力。动态代理可以在运行时创建代理类,无需预先知道所有代理的对象类型。 ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } public Object getInstance() { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 额外操作 preProcess(); Object result = method.invoke(target, args); // 后续操作 postProcess(); return result; } private void preProcess() { // 预处理逻辑 } private void postProcess() { // 后处理逻辑 } } // 使用动态代理 Image realImage = new RealImage(); Image proxyImage = (Image) new DynamicProxy(realImage).getInstance(); proxyImage.display(); ``` 以上就是代理模式的三种基本实现方式。在实际项目中,我们可以根据需求选择合适的实现方法,以增加代码的灵活性和可扩展性。例如,动态代理在处理多个具有相同接口的对象时特别有用,因为不需要为每个对象创建一个新的代理类。而继承和接口实现则更适用于已知具体类的情况下。通过代理模式,我们可以在不修改原有代码的基础上,增加新的功能和控制,使得系统设计更加灵活。
- 1
- 粉丝: 387
- 资源: 6万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Cisco Packet Tracer实用技巧及网络配置指南
- 国际象棋棋子检测8-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- jQuery信息提示插件
- 电动蝶阀远程自动化控制系统的构建与应用
- 基于python和协同过滤算法的电影推荐系统
- Hadoop复习资料题库.zip
- 国际象棋棋子检测3-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- Python毕业设计基于知识图谱的电影推荐系统源码(完整项目代码)
- 基于C++的简易图书管理系统(含exe可执行文件)
- 使用python爬取数据并采用Django搭建系统的前后台,使用Spark进行数据处理并进行电影推荐项目源码