zoukankan      html  css  js  c++  java
  • 设计模式之代理模式(动态代理)

    跟之前上一篇静态代理的差不多。这个是在执行的时候动态的产生代理对象,开始是不知道具体的代理对象,是传入具体对象,就产生该具体对象的代理对象。而之前的静态代理是预知要传入的具体对象交给哪一个代理对象执行。

    代码实现。

    首先定义抽象角色,他是代理对象和具体对象的共同接口。可以是接口,也可以是抽象类。

    //抽象角色 定义的是一种类型 具有某种共同行为的类型

    public interface ProxyInterface{

      //定义行为,代理对象和具体对象的共同行为

      public void run();

    }

    //定义具体对象  也要实现抽象角色 

    public class SpecificObj implements ProxyInterface{

          public void run(){

              //执行具体的方法

             System.out.println("执行具体对象的方法");

         }

    }

    //定义代理角色   要动态生成代理角色,都是要实现InvocationHandler

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

    public class ProxyDemo implements InvocationHandler{

    //在这里维护一个私有的具体对象

    private Object target;

    //定义构造函数,参数是具体要代理的对象

       ProxyDemo (Object target){

        this.target=target;

      }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Object result = null;

    //调用具体对象前的操作
    result = method.invoke(obj,args);

    //调用具体对象后的操作
    return result;
    }

    public static Object bind(Object obj){

    //动态生成具体的代理对象
    return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),new ProxyDemo(obj));
    }

    }

    public class MainTest {

    public static void main(Strings[] args){

    ProxyInterface proxy = (ProxyInterface)new ProxyDemo().bind(new SpecificObj());

    proxy .run();

    }

    }

  • 相关阅读:
    BZOJ 3262 cdq分治 OR 树套树
    Weekly Contest 132
    1007. Minimum Domino Rotations For Equal Row
    1002. Find Common Characters
    974. Subarray Sums Divisible by K
    926. Flip String to Monotone Increasing
    918. Maximum Sum Circular Subarray
    914. X of a Kind in a Deck of Cards
    907. Sum of Subarray Minimums
    900. RLE Iterator
  • 原文地址:https://www.cnblogs.com/hjy9420/p/4100388.html
Copyright © 2011-2022 走看看