最近在看mybatis源码,里面用到了很多设计模式。补习设计模式的知识~
先从动态代理模式入手。
先抛出一个问题:代理类能被动态代理吗?答案:可以。
1.定义两个接口。
public interface Log {
/**
* 记录日志
*/
void info();
}
public interface Shop {
/**
* 销售商品
*/
void sell();
}
2. 两个实现类,实现Shop和Log接口。
public class CoffeeShop implements Shop, Log {
@Override
public void sell() {
System.out.println("sell coffee");
}
@Override
public void info() {
System.out.println("coffee log");
}
}
public class FlowerShop implements Shop, Log {
@Override
public void sell() {
System.out.println("sell flower");
}
@Override
public void info() {
System.out.println("flower info");
}
}
3. 接下来要实现动态代理类,这个类必须实现接口InvocationHandler。
动态类调用方法时候,会根据生成代理类时传入的InvocationHandler 实现类h,自动调用h的invoke方法。
public class ShopProxy implements InvocationHandler {
private Object target;
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("----ShopProxy start---");
method.invoke(target, args);
System.out.println("----ShopProxy end---");
return null;
}
}