本文介绍: 代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。充当了代理对象,它可以在需要时创建真实对象。,从而实现虚拟代理的效果,延迟加载大图。
Java设计模式中的代理模式
代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。
代码举例演示
静态代理:
// 接口
interface Subject {
void request();
}
// 真实对象
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 代理对象
class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("Proxy: Pre-processing request.");
realSubject.request();
System.out.println("Proxy: Post-processing request.");
}
}
动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 接口
interface Subject {
void request();
}
// 真实对象
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 动态代理处理器
class DynamicProxyHandler implements InvocationHandler {
private Object realSubject;
public DynamicProxyHandler(Object realSubject) {
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Dynamic Proxy: Pre-processing request.");
Object result = method.invoke(realSubject, args);
System.out.println("Dynamic Proxy: Post-processing request.");
return result;
}
}
// 使用动态代理
public class DynamicProxyExample {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Subject proxyInstance = (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(),
new Class[]{Subject.class},
new DynamicProxyHandler(realSubject)
);
proxyInstance.request();
}
}
区别:
- 静态代理: 代理类在编译时就已经确定,并且需要为每个被代理的类编写一个代理类。
- 动态代理: 代理类在运行时动态生成,无需为每个被代理的类编写具体的代理类。使用
InvocationHandler
接口来处理代理逻辑,通过Proxy.newProxyInstance
方法创建代理对象。
具体应用场景
代理模式的应用场景包括:
- 远程代理: 用于在不同地址空间中代表对象,例如远程方法调用(RMI)。
- 虚拟代理: 用于按需创建开销较大的对象,例如加载大图时先显示缩略图。
- 保护代理: 控制对敏感对象的访问,例如权限控制。
举例说明:
// 接口
interface Image {
void display();
}
// 真实对象
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadImageFromDisk();
}
private void loadImageFromDisk() {
System.out.println("Loading image: " + filename);
}
@Override
public void display() {
System.out.println("Displaying image: " + filename);
}
}
// 代理对象
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
,从而实现虚拟代理的效果,延迟加载大图。
代理模式的优点
代理模式的优点包括:
- 控制对真实对象的访问: 代理可以在访问真实对象前后添加额外的逻辑,实现对真实对象的控制。
- 实现懒加载: 代理模式可以延迟创建真实对象,只有在需要时才进行实例化。
- 简化客户端: 客户端无需直接操作真实对象,通过代理对象完成操作,简化了客户端的调用。
- 增加安全性: 代理可以控制对真实对象的访问权限,增加系统的安全性。
原文地址:https://blog.csdn.net/qq_37431461/article/details/135833934
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_61785.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。