标签:
Java代理模式分为静态代理和动态代理模式
静态代理模式比较简单,直接上图和代码:
代理模式类图如下:
在代理模式中的角色:
● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
● 目标对象角色:定义了代理对象所代表的目标对象。
● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
抽象对象角色
package proxy.staticProxy;
/**
* 抽象角色,真实角色和代理角色都要实现的接口
* @author marcopan
*/
public interface IAbstractSubject {
// 代理对象和真实角色共有的方法,租房()
public void requestHouse();
}
目标对象角色
package proxy.staticProxy;
/**
* 真实角色--房东
* @author marcopan
*/
public class RealSubject implements IAbstractSubject {
@Override
public void requestHouse() {
System.out.println("requestHouse from RealSubject");
}
}
代理对象角色
package proxy.staticProxy;
/**
* 代理角色,中介,含有真实角色的引用
* @author marcopan
*/
public class StaticProxySubject implements IAbstractSubject {
// 含有真实角色的引用
IAbstractSubject subject = null;
public StaticProxySubject() {
}
public StaticProxySubject(IAbstractSubject subject) {
this.subject = subject;
}
@Override
public void requestHouse() {
this.preRequest();
subject.requestHouse();
this.postRequest();
}
private void preRequest() {
System.out.println("preRequest from ProxySubject");
}
private void postRequest() {
System.out.println("postRequest from ProxySubject");
}
}
客户端
package proxy.staticProxy;
public class Client {
public static void main(String[] args) {
IAbstractSubject subject = new RealSubject();
IAbstractSubject proxySubject = new StaticProxySubject(subject);
proxySubject.requestHouse();
}
}
从上面的例子可以看出代理对象将客户端的调用委派给目标对象,在调用目标对象的方法之前跟之后都可以执行特定的操作。
标签:
原文地址:http://www.cnblogs.com/panning/p/5927734.html