0
点赞
收藏
分享

微信扫一扫

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

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

大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

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中的代理模式及其两种实现方式:静态代理和动态代理。静态代理适用于编译时已知代理类的情况,而动态代理则能够在运行时生成代理类,提供更大的灵活性和可扩展性。

微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

举报

相关推荐

0 条评论