1.我说理解的代替
用图说话 直接上代码
public class Facade implements InvocationHandler{ private Object obj = null; private static Facade facade = null; private static Facade getInstence(){ if(facade == null){ facade = new Facade(); } return facade; } public static Object get(Object obj){ getInstence().obj = obj; /** * 说明:这里可以看做返回一个代理对象 * 这个方法的作用:1.载入Interface的Class里面会自动在JVM里面找到这个Interface的实现 * 2.载入一个 InvocationHandler 这个Hander所做的事情就是在方法调用之前 之后干你想做的事 * 3.真正返回的是接口实现的对象 */ return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), getInstence()); } /** * 重写代理调用 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before Method Exec"); Object result = method.invoke(obj, args); System.out.println("After Method Exec"); return result; } }
接口 必须实现
/** * * @author yunyang * */ public interface IProxyInterface { public void add(); public void delete(); }
接口实现
public class ProxyImpl implements IProxyInterface { @Override public void add() { // TODO Auto-generated method stub System.out.println("Add Method Exec"); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("Delete Method Exec"); } }
测试代码
public class Test { public static void main(String[] args) throws ClassNotFoundException,Exception { IProxyInterface impl = (IProxyInterface)Facade.get(new ProxyImpl()); //这里看做是代理对象调用的方法 只是和原有对象方法一样那样就好理解了 impl.add(); impl.delete(); } }
这样的好处 把接口以及实现写到接口文件里面 那样可以降低耦合 facade 思想