服务器学习网 > 编程学习 > Java代理模式有何用,怎样实现动态和静态代理?

Java代理模式有何用,怎样实现动态和静态代理?

服务器学习网综合整理   2024-10-24 18:28:02

Java代理模式的作用 Java代理模式的主要作用在于增强目标对象的功能,同时不直接修改原有代码。通过代理,我们可以在不破坏原有系统结构的前提下,为目标对象添加额外的功能,如日志记录、性能监测、访问控制等。此外,代理模式还提高了程序的灵活性和扩展性。 静态代理的实现 静态代理在编译时就已经确定了代理...

在Java编程中,代理模式是一种极其重要且常用的设计模式,它主要用于在访问对象时提供一个代理,以控制对这个对象的访问。那么,Java代理模式究竟有何用?又怎样实现动态和静态代理呢?

Java代理模式的作用

Java代理模式的主要作用在于增强目标对象的功能,同时不直接修改原有代码。通过代理,我们可以在不破坏原有系统结构的前提下,为目标对象添加额外的功能,如日志记录、性能监测、访问控制等。此外,代理模式还提高了程序的灵活性和扩展性。

静态代理的实现

静态代理在编译时就已经确定了代理类和原对象之间的关系。实现静态代理,需要代理类实现与目标对象相同的接口,并在代理类中调用目标对象的方法,同时在调用前后添加额外的处理逻辑。

示例代码

public interface ByClothes {
    void clothes(String size);
}

public class ClothesFactory implements ByClothes {
    @Override
    public void clothes(String size) {
        System.out.println(size + " 尺寸的衣服制作完毕");
    }
}

public class ClothesProxy implements ByClothes {
    private ClothesFactory clothesFactory;

    public ClothesProxy(ClothesFactory clothesFactory) {
        this.clothesFactory = clothesFactory;
    }

    @Override
    public void clothes(String size) {
        frontService();
        clothesFactory.clothes(size);
        endService();
    }

    public void frontService() {
        System.out.println("售前服务");
    }

    public void endService() {
        System.out.println("售后服务");
    }
}

动态代理的实现

动态代理在程序运行时动态地创建代理对象,主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现。与静态代理不同,动态代理不需要为每个目标对象编写专门的代理类,而是通过反射机制动态生成代理类。

示例代码

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Company implements InvocationHandler {
    private Object obj;

    public void setObj(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        frontService();
        Object result = method.invoke(obj, args);
        endService();
        return result;
    }

    public void frontService() {
        System.out.println("售前服务");
    }

    public void endService() {
        System.out.println("售后服务");
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
            obj.getClass().getClassLoader(),
            obj.getClass().getInterfaces(),
            this
        );
    }
}

总结

Java代理模式有何用,怎样实现动态和静态代理?

Java代理模式通过提供额外的访问方式,增强了目标对象的功能,同时保持了原有代码的完整性和可扩展性。静态代理在编译时确定代理关系,实现简单但灵活性较差;动态代理则通过反射机制在运行时动态生成代理类,更加灵活且功能强大。根据实际需求选择合适的代理方式,可以显著提升Java应用程序的灵活性和可维护性。

推荐文章