代理模式也被称为委托模式,它是结构型设计模式的一种。在现实生活中我们用到类似代 理模式的场景有很多,比如代理上网、打官司等。
静态代理
抽象主题类
public interface IShop {
void buy();
}
真实主题类
public class RealShop implements IShop{
@Override
public void buy() {
System.out.println("购买");
}
}
代理类
持有被代理对象,调用的还是被代理对象的 buy() 方法
public class ProxyShop implements IShop{
private IShop iShop;
public ProxyShop(IShop iShop) {
this.iShop = iShop;
}
@Override
public void buy() {
iShop.buy();
}
}
客户端
public static void main(String[] args) {
// 被代理对象
IShop mainShop = new RealShop();
// 代理对象
IShop proxyShop = new ProxyShop(mainShop);
proxyShop.buy();
}
动态代理
动态代理则是在代码运行时通过反射来动态地 生成代理类的对象,并确定到底来代理谁。
创建动态代理
public class DynamicPurchasing implements InvocationHandler {
// 被代理类
private Object object;
public DynamicPurchasing(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object, args);
if (method.getName().equals("buy")){
System.out.println(object.getClass().getCanonicalName()+" buy");
}
return result;
}
}
客户端
public static void main(String[] args) {
// 被代理类
RealShop realShop = new RealShop();
// 动态代理
DynamicPurchasing dynamicPurchasing = new DynamicPurchasing(realShop);
// 被代理类的 ClassLoader
ClassLoader classLoader = realShop.getClass().getClassLoader();
// 动态创建代理类
IShop iShop = (IShop) Proxy.newProxyInstance(classLoader, new Class[]{IShop.class}, dynamicPurchasing);
iShop.buy();
}
代理类的优点
- 真实主题类就是实现实际的业务逻辑,不用关心其他非本职的工作。
- 真实主题类随时都会发生变化;但是因为它实现了公共的接口,所以代理类可以不做任 何修改就能够使用。