代理模式 & 动态代理

来源:互联网 发布:linux文件自启动脚本 编辑:程序博客网 时间:2024/04/29 07:12

代理模式(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();    }
0 0
原创粉丝点击