使用场景
不希望目标对象对外暴露,可以使用代理模式来保护,同时代理类也可以进行扩展。
静态代理
静态代理就是由程序员创建或特定工具生成源代码,在对其编译之前
优点:符合开闭原则情况下,对目标对象进行功能扩展。
缺点:每一个服务都得创建代理类,工作量大,不易管理,接口一旦发生改变,代理类也要修改。
public interface BuyCar {
void buyCar();
}
public class BuyCarImpl implements BuyCar {
@Override
public void buyCar() {
System.out.println("买车了");
}
}
//代理类
public class BuyCarProxy {
private BuyCar buyCar;
public BuyCarProxy(BuyCar buyCar) {
this.buyCar = buyCar;
}
public void buyCar() {
buyCar.buyCar();
}
}
//使用
BuyCarProxy buyCarProxy = new BuyCarProxy(new BuyCarImpl());
buyCarProxy.buyCar();
动态代理
动态代理就是在程序运行过程中通过反射机制动态创建
优点:只需要编写一个动态处理器就可以了,减少开发量,降低耦合度
缺点:反射效率低,
public class DynamicProxyHandler implements InvocationHandler {
private Object object;
public DynamicProxyHandler(Object o) {
this.object = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object,args);
return result;
}
}
//使用
BuyCar buyHouse = new BuyCarImpl();
BuyCar proxyBuyHouse = (BuyCar) Proxy.newProxyInstance(BuyCar.class.getClassLoader(), new
Class[]{BuyCar.class}, new DynamicProxyHandler(buyHouse));
proxyBuyHouse.buyCar();