复制代码
/**
* 借钱方
*
* @author moon
*
*/
public interface ILender {
/**和平方式*/
public long peace(String name);
/**暴力方式*/
public long force(String name);
}
复制代码
我月中找张三借钱:
复制代码
public class ZhangSanImpl implements ILender {
public long peace(String name) {
System.out.println("心平气和的找" + name + "要账。");
return 100;
}
public long force(String name) {
System.out.println("以暴力方式找" + name + "要账");
return 250;
}
}
复制代码
月底又找李四借钱(都是好欺负的货,动手干不过我):
复制代码
public class LiSiImpl implements ILender {
public long peace(String name) {
System.out.println("心平气和的找" + name + "要账。");
return 100;
}
public long force(String name) {
System.out.println("以暴力方式找" + name + "要账");
return 250;
}
}
复制代码
张三和李四发现我老是借钱又拖帐,于是就合伙找了年级里一个比较横的角色(外号"JDK",由来是因为我叫jd,他是jd killer)来代他们要帐,好说不行就动手。看这就是代理模式。
复制代码
/**
* 借钱者的代理人
*
* @author jdzhan
*
*/
public class CommonLenderProxy implements ILender {
/** 委托者 */
private ILender delegator;
public CommonLenderProxy(ILender delegator) {
this.delegator = delegator;
}
public long peace(String name) {
return delegator.peace(name);
public long force(String name) {
System.out.println("开始工作");
// 执行方法
long result = delegator.force(name);
System.out.println("搞定收工");
return result;
}
}
复制代码
于是乎我屈于淫威或者武力只能乖乖还钱鸟:
// Common Proxy
CommonLenderProxy proxy = new CommonLenderProxy(new ZhangSanImpl());
long money = proxy.force("zhanjindong");
System.out.println("要回了" + money + "块QB");
开始工作
以暴力方式找zhanjindong要账
搞定收工
要回了250块QB
Ok,上面我用了亲身的一个小栗子说明了静态代理,那动态代理到底怎么实现,又有什么好处呢?我们先直接把上面的实现给出来。JDK动态代理中包含一个接口和一个类:
InvocationHandler接口:
public interface InvocationHandler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
Proxy类:
public static Object newProxyInstance(ClassLoader loader, Class< >[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
"JDK"觉得代人要钱很有钱途,于是搞了个“帮会”:
复制代码
/**
* “JDK”代人人要账帮会
*
* @author jdzhan
*
*/
public class DynamicLenderProxy implements InvocationHandler {
private Object target;
/**
* 绑定委托对象并返回一个代理类
*
* @param target
* @return
*/
public Object bind(Object target) {
this.target = target;
// 取得代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/**
* 调用方法
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("force")) {
Object result = null;
System.out.println("开始工作");
// 执行方法
result = method.invoke(target, args);