您的位置:首页 > 编程语言 > Java开发

java设计模式___Proxy代理模式

2017-02-19 20:40 741 查看
简述

二月十四号情人节日,在这一天真是吃了大把大把的狗粮啊!我朋友想给他女朋友买了个苹果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);

//获取真实主题类的ClassLoader
ClassLoader 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

本人描述能力有限!欢迎指出不足之处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息