代理模式 & 动态代理

代理模式(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();
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(动态代理,代理,模式)