代理模式 & 动态代理
2015-05-28 22:55
387 查看
代理模式(proxy Pattern)有三个角色:
抽象主题角色(Subject):是真实主题和代理主题的公共接口,以便在任何可以使用真实主题的地方都可以使用代理主题。代理主题角色(proxy Subject):负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题对象,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
真实主题角色(Real Subject):委托角色,是业务逻辑的具体执行者。
Subject:
public interface Subject { public void request(); }
RealSubject:
public class RealSubject implements Subject{ @Override public void request() { } }
ProxySubject:
public class ProxySubject implements Subject{ private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void request() { this.beforeRequest(); subject.request(); this.afterRequest(); } private void beforeRequest() { } private void afterRequest() { } }
我们发现代理模式和装饰者模式很类似,两者区别不大,但是在意义上不同:
代理模式是实现一些与目标对象功能关联不太紧密的职责;而装饰者是处理同一问题域名。
装饰者是为了为目标对象添加功能活着减少功能。
java中的动态代理:
java1.3版本以后,引入了动态代理,使用起来非常简单快捷。
public class DaoProxy <T extends Dao> implements InvocationHandler { private T t; @SuppressWarnings("unchecked") public T bind(T t ) { this.t = t; return (T) Proxy.newProxyInstance( t.getClass().getClassLoader(), t.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object rst = null; before(); rst = method.invoke(t, args); after(); return rst; } private void before() { System.out.println("before ..."); } private void after() { System.out.println("after"); } }
DemoClient:
public static void main(String[] args) { DaoProxy<UserDao> userDaoProxy = new DaoProxy<UserDao>(); UserDao xx = userDaoProxy.bind(new UserDaoImpl()); xx.insert(); }