代理模式

    技术2025-09-12  67

    1、代理模式实现的是对目标对象功能的一种增强,具体有静态代理和动态代理。

    2、静态代理

    package com.dengfangwen.org; interface Operator { void add(); } class Plus implements Operator { public void add() { System.out.println(" do add "); } } public class Proxy implements Operator { Operator operator; Proxy(Operator operator) { this.operator = operator; } public void add() { System.out.println(" do add before "); operator.add(); System.out.println(" do add after "); } public static void main(String[] argc) { Proxy proxy = new Proxy(new Plus()); proxy.add(); } }

    通过调用proxy的方法间接调用目标对象的同类方法,并可以在目标对象方法前后做一些功能增强处理。

    实现上: 目标类和代理类必须实现同一接口,代理类对象持有目标对象的引用,能增强的方法只限于公共接口中的方法。

    3、动态代理

    动态代理是利用java的反射,动态生成代理对象。

    package com.dengfangwen.org; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Operator { void add(); } class Plus implements Operator { public void add() { System.out.println(" do add "); } } //最大的区别点在于静态代理实现是Operator,动态代理实现的invocation public class ProxyDynamic implements InvocationHandler { //这里持有的是可以代表所有类的对象,而不仅仅是Operator对象 //不同接口类对象可以共同适用与这个代理类,因此可以大大减少代理类的数量 private Object object; public ProxyDynamic(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("enhance add before "); Object result = method.invoke(object, args); System.out.println("enhance add before "); return result; } public static void main(String[] argc) { ProxyDynamic proxy = new ProxyDynamic(new Plus()); Operator operator = (Operator) Proxy.newProxyInstance(Plus.class.getClassLoader(), new Class[]{ Operator.class}, proxy); operator.add(); } }

    通过对比发现:

    上面静态代理和动态代理实现的最大区别在于:

    静态代理: 代理类实现的是共同的接口Operator ,持有的是Operator对象,因为只能代理Operator子类对象。

    jdk 动态代理: 代理类实现的是 InvocationHandler 接口,并重写 invoke 方法,持有的是Object对象,可以代理所有对象。不同族类的对象可以共用一个代理,可以大大减少代理类的数量。

    Processed: 0.017, SQL: 9