-----------------------题记:
因为在使用HibernateCallback中遇到的疑问,所以上网查了很多资料,明白原理后发现跟代理模式很像,那么它们是怎么实现的,有什么区别和相同之处呢?
-----------------------代码:
【callback demo】
package callback;
public class Test {
public static void main(String[] args) {
//调用method方法
new Template().method(new Callback() {
//在参数列表中实现接口的方法,返回一个引用(接口不允许有构造方法,目测不是存在堆里面)
public void execute(String session) {
System.out.println(session);
}
});
}
}
//封装的环绕callback的类模板
class Template {
//执行方法中的参数
private String mySession = "I'm session";
public void method (Callback callback) {
//方法执行前
System.out.println("before");
//回调执行的方法
callback.execute(mySession);
//方法执行后
System.out.println("after");
}
}
//接口(提供需要强制实现的方法)
interface Callback {
void execute(String session);
}
【proxy demo】
package proxy;
public class Test {
public static void main(String[] args) {
//引用指向原型去do it
DoSomething doSomething = new Model();
//偷梁换柱,完成对原型的包装,引用指向代理
doSomething = new Proxy(doSomething);
//使用代理去do it
doSomething.doIt();
}
}
//原型
class Model implements DoSomething {
@Override
public void doIt() {
// TODO Auto-generated method stub
System.out.println("do it");
}
}
//代理
class Proxy implements DoSomething {
private DoSomething doSomething;
//测试使用构造注入更方便
public Proxy (DoSomething doSomething) {
this.doSomething = doSomething;
}
@Override
public void doIt() {
// TODO Auto-generated method stub
//原型do it之前
System.out.println("before");
//原型去do it
doSomething.doIt();
//原型do it之后
System.out.println("after");
}
}
//do something
interface DoSomething {
void doIt();
}
两者都是对某原型的前后进行包装装饰,区别是callback更加灵活,每次可以实现不同的方法,而proxy更加方便,每次使用同一个方法。