代理模式也被称为委托模式,它是结构型设计模式的一种。在现实生活中咱们用到相似代理模式的场景有不少,好比代理上网、打官司等。设计模式
为其余对象提供一种代理以控制对这个对象的访问。安全
Server
部分的实现隐藏。我多年没有回哈尔滨了,很想念哈尔滨的秋林红肠味道。可是本人由于工做一直很忙抽不开身,不可以亲自回哈尔滨购买,因而就拜托在哈尔滨的朋友帮我购买秋林红肠。bash
buy
public interface IShop {
void buy();
}
复制代码
Giants
就是我,实现了 IShop
接口提供的 buy
方法。public class Giants implements IShop {
@Override
public void buy() {
System.out.println("购买");
}
}
复制代码
IShop
接口,而且要持有被代理者,在 buy
方法中调用了被代理者的 buy
方法。public class Purchasing implements IShop {
private IShop mShop;
public Purchasing(IShop shop) {
this.mShop = shop;
}
@Override
public void buy() {
mShop.buy();
}
}
复制代码
public class Client {
public static void main(String[] args) {
IShop giants = new Giants();
IShop purchasing = new Purchasing(giants);
purchasing.buy();
}
}
复制代码
上面的例子是一个静态的代理,在代码运行前已经存在了代理类的
class
编译文件;而动态代理则是在带来运行时经过反射来动态地生成代理类的对象,并肯定到底代理谁。咱们在编码阶段无需知道代理谁,代理谁将会在代码运行时觉定。ide
/**
* 实现Java提供的动态代理接口 InvocationHandler ,实现该接口须要重写 invoke 方法
*/
public class DynamicPurchasing implements InvocationHandler {
private Object obj;
public DynamicPurchasing(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(obj, args);
if(method.getName().equals("buy")){
System.out.println("Giants在买买买");
}
return result;
}
}
复制代码
Proxy.newProxyInstance
来生成动态代理类,调用 purchasing
的 buy
方法会调用 mDynamicPurchasing
的 invoke
方法。public class Client {
public static void main(String[] args) {
//建立 Giants
IShop giants = new Giants();
//建立动态代理
DynamicPurchasing mDynamicPurchasing = new DynamicPurchasing(giants);
//建立 giants 的 ClassLoader
ClassLoader loader = giants.getClass().getClassLoader();
//动态建立代理类
IShop purchasing = (IShop) Proxy.newProxyInstance(loader, new Class[] {IShop.class}, mDynamicPurchasing);
purchasing.buy();
}
}
复制代码