深入理解Java中的代理模式及其实现

简介: 深入理解Java中的代理模式及其实现

深入理解Java中的代理模式及其实现

1. 代理模式概述

代理模式是一种结构型设计模式,其目的是通过代理对象控制对其他对象的访问。代理模式常用于实现日志记录、性能监控、权限控制等功能,同时它也能够实现延迟加载、按需加载等优化。

2. 静态代理

静态代理是在编译时确定代理类的实现,在Java中通过接口实现代理较为常见。下面是一个简单的示例,展示了如何通过静态代理实现日志记录功能。

2.1 创建接口
package cn.juwatech.proxy;
public interface UserService {
    void save(String user);
}
2.2 实现目标对象
package cn.juwatech.proxy;
public class UserServiceImpl implements UserService {
    @Override
    public void save(String user) {
        System.out.println("Saving user: " + user);
    }
}
2.3 创建代理类
package cn.juwatech.proxy;
public class UserServiceProxy implements UserService {
    private UserService target;
    public UserServiceProxy(UserService target) {
        this.target = target;
    }
    @Override
    public void save(String user) {
        System.out.println("Before saving user");
        target.save(user);
        System.out.println("After saving user");
    }
}
2.4 测试静态代理
package cn.juwatech.proxy;
public class ProxyPatternDemo {
    public static void main(String[] args) {
        UserService target = new UserServiceImpl();
        UserService proxy = new UserServiceProxy(target);
        proxy.save("Alice");
    }
}

3. 动态代理

动态代理是在运行时生成代理类,无需编写代理类的实现。Java中的动态代理主要依赖于java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler接口。

3.1 创建InvocationHandler
package cn.juwatech.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class UserServiceInvocationHandler implements InvocationHandler {
    private Object target;
    public UserServiceInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before invoking method: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After invoking method: " + method.getName());
        return result;
    }
}
3.2 创建动态代理
package cn.juwatech.proxy.dynamic;
import cn.juwatech.proxy.UserService;
import cn.juwatech.proxy.UserServiceImpl;
import java.lang.reflect.Proxy;
public class DynamicProxyPatternDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserServiceInvocationHandler handler = new UserServiceInvocationHandler(userService);
        UserService proxy = (UserService) Proxy.newProxyInstance(
                UserService.class.getClassLoader(),
                new Class[]{UserService.class},
                handler);
        proxy.save("Bob");
    }
}

4. 总结

通过本文,你深入理解了Java中的代理模式及其两种实现方式:静态代理和动态代理。静态代理适用于编译时已知代理类的情况,而动态代理则能够在运行时生成代理类,提供更大的灵活性和可扩展性。

相关文章
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
60 1
|
2月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
6月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
3月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
6月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
57 2
|
4月前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
51 0
|
4月前
|
设计模式 监控 Java
深入理解Java中的代理模式及其实现
深入理解Java中的代理模式及其实现
|
5月前
|
设计模式 监控 安全
设计模式之代理模式(Java)
设计模式之代理模式(Java)
|
5月前
|
设计模式 安全 Java
Java设计模式:代理模式的静态和动态之分(八)
Java设计模式:代理模式的静态和动态之分(八)
|
5月前
|
设计模式 Java
Java设计模式之代理模式详解
Java设计模式之代理模式详解