设计模式之代理模式的静态代理和动态代理

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

以下是代码实现:

package com.porxy;

/**
 *  定义一个抽象类,含有一个抽象方法
 */
public abstract class Subject {
    public  abstract  void Request();
}


/**
 * 一个真实的类,被代理的对象
 */
public class RealSubject extends Subject {
    @Override
    public void Request() {
        System.out.println("真实的请求");
    }
}


/**
 * 代理类,其中含有一个对象的引用
 */
public class Proxy extends  Subject {
    RealSubject realSubject ;

    @Override
    public void Request() {
        if (realSubject == null){
            realSubject = new RealSubject();
        }
        realSubject.Request();
    }
}


/**
 *客户端,通过调用代理对象,而实现真实类的方法
 */
public class ProxyMain {
    public static void main(String[] args) {
        Proxy px = new Proxy();
        px.Request();
    }
}

动态代理,底层应该就是封装了上面的代码,传入三个参数(类的加载,接口,代理对象)

InvocationHandler注释翻译: 调用处理程序是由代理实例的调用处理程序实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用被编码并发送到调用处理程序的调用方法

package com.porxy;

/**
 * 声明一个接口,含有一个方法
 */
public interface Subject {
     void Request();
}


package com.porxy;

/**
 * 实现类,也就是被代理的类,实现这个方法
 */
public class RealSubject implements Subject {
    @Override
    public void Request() {
        System.out.println("一辆豪车启动");
    }
}

以下是动态代理类


package com.porxy;

import java.lang.reflect.*;
import java.lang.reflect.Proxy;

/**
* 先创建一个被代理的对象
*
*/
public class DynamicProxy {

public static void main(String[] args) {

final RealSubject realSubject = new RealSubject();

Subject instance = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
new Class[]{Subject.class}, new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                        if ("Request".equals(method.getName())) {
//
// System.out.println("豪车加速");
//
// Object obj = method.invoke(realSubject, args);
//
// System.out.println("3秒破百");
// return obj;
//
// }

Object obj = method.invoke(realSubject, args);
return obj;

}
});
instance.Request();
}


}
 /* 输出为:

     豪车加速
    一辆豪车启动
    3秒破百    */

    
原文地址:https://www.cnblogs.com/JavaBlackHole/p/7667843.html