java设计模式___Proxy代理模式

来源:互联网 发布:宋神宗资治通鉴序 知乎 编辑:程序博客网 时间:2024/06/14 10:56
  • 简述
    二月十四号情人节日,在这一天真是吃了大把大把的狗粮啊!我朋友想给他女朋友买了个苹果7作为情人节礼物,可是手里钱不够怎么办呢,恰好我手里有一些闲钱,于是我就代他先买个苹果7,这一波狗粮吃的十分过瘾啊!其实这就是一种代理。下面用代码详细说明一下:

  • 公共接口的设计(买苹果7)

/** * Created by Administrator on 2017/2/17 0017. * @param 公共接口 * * 代理模式: * 我代朋友买了一个苹果7,送给他女朋友 * 成员:我    我朋友 *      我朋友自己也能买,由于资金的问题我代替他买了,然后送给他女朋友 *      我其实就是代理类   我朋友就是被代理类 */public interface WasProxy_interface {    void buy1(String s);    void buy2();    void buy3();    void buy4();}
  • 被代理类(我朋友)
    需要实现公共接口
/***@param 被代理类*/public class MyFriends implements WasProxy_interface {    private String Tag="Me_proxy";    @Override    public void buy1() {        Log.e(Tag,"Proxy买手机1");    }    @Override    public void buy2() {        Log.e(Tag,"Proxy买手机2");    }    @Override    public void buy3() {        Log.e(Tag,"Proxy买手机3");    }    @Override    public void buy4() {        Log.e(Tag,"Proxy买手机4");    }}
  • 代理类(我)
    需要实现公共接口
/** * Created by Administrator on 2017/2/17 0017. * @param 代理类 */public class Repairman implements WasProxy_interface{    /**     * 构造方法里声明公共接口     * */    private WasProxy_interface wasProxy_interface;    public Repairman(WasProxy_interface wasProxy_interface){            this.wasProxy_interface=wasProxy_interface;    }    @Override    public void buy1() {        wasProxy_interface.buy1();    }    @Override    public void buy2() {        wasProxy_interface.buy2();    }    @Override    public void buy3() {        wasProxy_interface.buy3();    }    @Override    public void buy4() {        wasProxy_interface.buy4();    }}
  • 调用
/***这种方式是静态代理模式*/ WasProxy_interface wasProxy_interface = new MyFriends (); Repairman repairman = new Repairman(wasProxy_interface);           repairman.buy1();           repairman.buy2();           repairman.buy3();           repairman.buy4();
  • Log

    这里写图片描述

  • 动态代理模式

    使用动态代理模式还需要定义一个类实现InvocationHandler

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * Created by Administrator on 2017/2/17 0017. * @param 处理器类 */public class DynamicConditionProxy implements InvocationHandler {    /**     * 声明一个Object作为被代理类     * */    private Object object;    /**     * 将需要代理的实例通过 处理器类 的构造方法传递给代理。     */    public DynamicConditionProxy(Object object){        this.object=object;    }    @Override    public Object invoke(Object obj, Method method, Object[] objects) throws Throwable {        /**         * method.invoke(object, objects);         * 第一个参数 :被代理类         * 第二个参数:被代理的方法         * */        Object invoke = method.invoke(object, objects);        return invoke;    }}
  • 调用
   /**    * 动态代理模式    * */WasProxy_interface wasProxy_interface = new MyFriends ();InvocationHandler ihandler = new DynamicConditionProxy(wasProxy_interface);//获取真实主题类的ClassLoaderClassLoader classLoader = wasProxy_interface.getClass().getClassLoader();//动态产生一个代理者。  Class<?>[] cls = new Class[]{WasProxy_interface.class};  WasProxy_interface wProxy = (WasProxy_interface) Proxy.newProxyInstance(classLoader, cls, ihandler);  wProxy.buy1();  wProxy.buy2();  wProxy.buy3();  wProxy.buy4();
  • 动态代理log

    这里写图片描述

这些就是对代理的介绍,其实在android源码中也用到了很多代理模式,有兴趣的朋友可以去看下!

最后奉上demo:http://download.csdn.net/detail/qq_34501274/9758145

本人描述能力有限!欢迎指出不足之处!

0 0