您的位置:首页 > 其它

代理模式 & 动态代理

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: