1.代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,代理类知道被代理类的行为,代理类与被代理类实现的是同一个接口,代理类与被代理类的结构是相同的;
2.静态代理:自己手写代理模式,作用代理指定接口下的实现,接口已经指定死了
3.代码实例
public interface Proxy { public abstract void getName(); public abstract void getAddress(); public abstract void getTel(); } public class ProxyReal implements Proxy { @Override public void getName() { System.out.println("lili"); } @Override public void getAddress() { System.out.println("beijing"); } @Override public void getTel() { System.out.println("12345678"); } } public class ProxyHandle implements Proxy{ private Proxy proxy; @Override public void getName() { proxy.getName();; } @Override public void getAddress() { proxy.getAddress(); } @Override public void getTel() { proxy.getTel(); } public ProxyHandle(Proxy proxy) { super(); this.proxy = proxy; } }
4.动态代理模式//较静态代理模式是可以找使用时指定接口以及接口下的实现类
public interface Proxy { public abstract void getName(); public abstract void getAddress(); } public class ProxyReal implements Proxy { @Override public void getName() { System.out.println("lili"); } @Override public void getAddress() { System.out.println("beijing"); } } public class ProxyHandle implements InvocationHandler { private Proxy proxy1; @Override // invoke(Object proxy, Method method, Object[] args) 利用的反射,可以对比一下方法反射 // 调用proxyreal时实际调用的方法, public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(proxy1, args); return proxy; } public ProxyHandle(Proxy proxy) { super(); this.proxy1 = proxy; } } public class Client { public static void main(String[] args) { ProxyHandle proxyHandle = new ProxyHandle(new ProxyReal()); Class<?> clazz = ProxyReal.class; // 需要指定类加载器的原因是防止已被某个加载器加载而不会再次加载(类加载机制,双亲委托机制),通过反射确定proxyreal.class的getInterfaces获取所实现的接口, cn.dynamicproxy.test.Proxy proxy = (cn.dynamicproxy.test.Proxy) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), proxyHandle); proxy.getName(); ; } }