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 2034 【2009国家集训队】 最大收益
    vijos P1780 【NOIP2012】 开车旅行
    BZOJ 2115 【WC2011】 Xor
    BZOJ 3631 【JLOI2014】 松鼠的新家
    BZOJ 4717 改装
    BZOJ 2957 楼房重建
    BZOJ 4034 【HAOI2015】 T2
    BZOJ 1834 【ZJOI2010】 network 网络扩容
    BZOJ 2440 【中山市选2011】 完全平方数
    BZOJ 2733 【HNOI2012】 永无乡
  • 原文地址:https://www.cnblogs.com/hjy9420/p/4100388.html
Copyright © 2011-2022 走看看