
Mybatis代理设计模式(Proxy)与编程实现原理
下面接着上篇文章写继续写多级代理
1. 实例讲解
a. 实例介绍
- 实现一个多级代理,螳螂捕蝉,黄雀在后。
- 蝉吃树叶,螳螂吃蝉,黄雀吃螳螂。
b. 具体实现
步骤1:创建一个接口对象(BaseService),声明真实对象(蝉),蝉的行为被监听,需要被代理对象1(螳螂)吃掉,螳螂的主要任务也是吃,行为被监听,被代理对象2(黄雀)吃掉。
public interface BaseService {
//吃是主要业务,也是被监听行为
public void eat();
}
步骤2:创建真实对象(蝉)
public class 蝉 implements BaseService {
@Override
public void eat() {
System.out.println("蝉吃树叶");
}
}
步骤3:创建代理对象1(螳螂) 也是被行为监听对象。
public class 螳螂 implements InvocationHandler {
private BaseService obj;//小蝉 真实对象
//invoke方法就是螳螂类的主要业务方法,也是需要被监听方法
@Override
public Object invoke(Object listener, Method method, Object[] args) throws Throwable {
//蝉吃树叶
method.invoke(obj, args);
次要业务();
return null;
}
//完成主要业务和次要业务绑定
public 螳螂(BaseService param) {
this.obj = param;
}
private void 次要业务(){
System.out.println("螳螂吃蝉");
}
}
步骤4:创建代理工厂(BeanFactory),对所有吃的行为有一个监听。
public class BeanFactory {
public static BaseService newInstance(Class classFile){
//1.创建一个真实的小蝉
BaseService 真实小蝉 = new 蝉();
//2.创建代理实现类对象 螳螂
InvocationHandler 螳螂 = new 螳螂(真实小蝉);
//3.向JVM所要代理对象(监听对象) 监听蝉何时吃树叶,通知螳螂
Class array[]={BaseService.class};
BaseService proxy1= (BaseService) Proxy.newProxyInstance(classFile.getClassLoader(), array, 螳螂);
}
}
步骤5:上面几个步骤基本上一级代理已经实现,下面主要思考螳螂的主要业务是什么?
public class 黄雀 implements InvocationHandler {
private Object proxy1;//监听小婵的监听对象
public 黄雀(Object proxy1) {
this.proxy1 = proxy1;
}
//method就是螳螂的主要方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//主要业务 螳螂军吃蝉,让一级代理对象通知螳螂,蝉吃树叶
method.invoke(proxy1, args);
次要业务();
return null;
}
private void 次要业务(){
System.out.println("黄雀吃螳螂");
}
}
步骤6:在BeanFactory中的newInstance方法添加代理实现类(黄雀)
public class BeanFactory {
.........................省略前面代码
//4.创建代理实现类 黄雀
InvocationHandler 黄雀 = new 黄雀(proxy1);
BaseService proxy2 =(BaseService) Proxy.newProxyInstance(classFile.getClassLoader(), array, 黄雀);
return proxy2;
}
}
步骤7:添加测试类
public class TestMain {
public static void main(String[] args) {
BaseService 小蝉 = BeanFactory.newInstance(蝉.class);
小蝉.eat();
}
}
测试结果
蝉吃树叶
螳螂吃蝉
黄雀吃螳螂
网友评论