Java设计模式中的代理模式

Java设计模式中的代理模式

代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。

代码举例演示

静态代理:

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.");
    }
}

动态代理

java 复制代码
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)。
  • 虚拟代理: 用于按需创建开销较大的对象,例如加载大图时先显示缩略图。
  • 保护代理: 控制对敏感对象的访问,例如权限控制。

举例说明:

java 复制代码
// 接口
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,从而实现虚拟代理的效果,延迟加载大图。

代理模式的优点

代理模式的优点包括:

  • 控制对真实对象的访问: 代理可以在访问真实对象前后添加额外的逻辑,实现对真实对象的控制。
  • 实现懒加载: 代理模式可以延迟创建真实对象,只有在需要时才进行实例化。
  • 简化客户端: 客户端无需直接操作真实对象,通过代理对象完成操作,简化了客户端的调用。
  • 增加安全性: 代理可以控制对真实对象的访问权限,增加系统的安全性。
相关推荐
小张认为的测试13 分钟前
Liunx上Jenkins 持续集成 Java + Maven + TestNG + Allure + Rest-Assured 接口自动化项目
java·ci/cd·jenkins·maven·接口·testng
蘑菇丁42 分钟前
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
java·ide·eclipse
呼啦啦啦啦啦啦啦啦2 小时前
【Redis】持久化机制
java·redis·mybatis
我想学LINUX3 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
空の鱼7 小时前
java开发,IDEA转战VSCODE配置(mac)
java·vscode
P7进阶路8 小时前
Tomcat异常日志中文乱码怎么解决
java·tomcat·firefox
小丁爱养花9 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
CodeClimb9 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
等一场春雨9 小时前
Java设计模式 九 桥接模式 (Bridge Pattern)
java·设计模式·桥接模式