代理模式会为某个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个java对象代表另一个java对象来采取行动。在某些情况下,客户端代码不想或不能够直接调用被调用者,代理对象可以在客户和目标对象之间起到中介的作用。
package proxy;
public interface Dog { public void info(); public void run(); }
package proxy;
public class GunDog implements Dog { public void info() { // TODO Auto-generated method stub System.out.println("我是一只猎狗"); } public void run() { // TODO Auto-generated method stub System.out.println("我奔跑迅速"); } }
package proxy;
public class TxUtil { public void beginTx(){ System.out.println("模拟开始事务"); } public void endtx(){ System.out.println("模拟结束事务"); } }
package proxy;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvokationHandler implements InvocationHandler { private Object target; public void setTarget(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub TxUtil tx = new TxUtil(); tx.beginTx(); Object result = method.invoke(target, args); tx.endtx(); return result; } }
package proxy;
import java.lang.reflect.Proxy; public class MyProxyFactory { public static Object getProxy(Object target) throws Exception{ MyInvokationHandler handler = new MyInvokationHandler(); handler.setTarget(target); return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler); } }
package proxy;
public class Test { public static void main(String args[]){ Dog target = new GunDog(); try { Dog dog = (Dog)MyProxyFactory.getProxy(target); dog.info(); dog.run(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
打印结果:
模拟开始事务
我是一只猎狗 模拟结束事务 模拟开始事务 我奔跑迅速 模拟结束事务