代理模式会为某个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个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();
        }
    }
}

 

打印结果:

模拟开始事务

我是一只猎狗
模拟结束事务
模拟开始事务
我奔跑迅速
模拟结束事务