java23种设计模式之五:代理模式

一.代理模式介绍

    代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程

   其中代理又分为:静态代理和动态代理

      静态代理:指的是自己要写一个代理类,或者用工具生成一个代理类,总之就是程序运行之前已经存且编译好的代理类.(自己写的类)
     动态代理:指由JVM虚拟机程序运行时产生的代理类。(jvm或第三方生成的类)

  动态类具有更强的灵活性,它不用在我们设计实现类时指定哪个类被代理了。

二.动态代理

  覆盖InvocationHandler接口中的invoke()方法,更重要的是,动态代理模式可以使得我们在不改变原来已有的代码结构的情况下,对原来的原有进行扩展、增强其功能,并且可以达到控制被代理对象的行为。

  每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。

public class DynamicProxy implements InvocationHandler{
    
     // 被代理类的实例
    Object proxy;
    
    public DynamicProxy(Object proxy) {
        this.proxy = proxy;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(this.proxy, args);
        return null;
    }

}


public interface ProxySSSS {
    public void buyCar(int cash);
}

public class User implements ProxyInterface{
    
    private int cash; //花费
    
    private String name;
    
    public User(int cash,String name){
        this.cash = cash;
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCash() {
        return cash;
    }

    public void setCash(int cash) {
        this.cash = cash;
    }

    public void buyCar() {
        System.out.println("花 "+cash +"钱买车");
    }

}

动态代理测试类

public class MainTest {
    public static void main(String[] args) {
        User user = new User("张三",1000);
        InvocationHandler handler = new DynamicProxy(user);
        /**
         * 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:
         * Proxy.newProxyInstance 3个参数的意思:
         *            handler.getClass().getClassLoader() : 获取代理类的加载 器来加载动态代理类对象
         *         user.getClass().getInterfaces()        : 该对象的方法就是代理类所代理的方法
         *         handler                                : InvocationHandler 对象
         */
        ProxySSSS instance = (ProxySSSS)Proxy.newProxyInstance(
                                            handler.getClass().getClassLoader(), 
                                            user.getClass().getInterfaces(), 
                                            handler);

        instance.buyCar(user.getCash());

    }
}

  

猜你喜欢

转载自www.cnblogs.com/MrRightZhao/p/10815311.html