1.意图
为其它对象提供一种代理以控制对这个对象的访问
2.参与者
Proxy - 保存一个引用使得代理可以访问实体
- 提供一个和subject的接口相同的接口
- 控制对实体的存取,并可能的创建和删除它
- 其它功能依赖于代理类型
Remote Proxy 负责请求及其参数进行编码,并向不同的地址空间
发送已编码的请求
Virtual Proxy 可以缓存实体的附加信息,以便延迟对它的访问
Protection Proxy 检查调用者是否具有实现一个请求所需的访问权限
Subject - 定义RealSubject和Proxy的共有接口
RealSubject - 实现Proxy所代表的实体
3.结构
4.代码
public interface Subject {
void draw();
}
public class RealSubject implements Subject {
@Override
public void draw() {
System.out.println("大对象");
}
}
public class VirtualProxy implements Subject {
private Subject subject;
@Override
public void draw() {
if(subject == null){
subject = new RealSubject();
}
subject.draw();
}
}
public class ProtectionProxy implements Subject {
private Subject subject = new RealSubject();
private List<String> safeClass = new ArrayList<String>();
ProtectionProxy(){
safeClass.add("designPattern.structModel.proxy.Client");
}
@Override
public void draw() {
boolean b = safeCheck();
if(b){
subject.draw();
}
}
private boolean safeCheck() {
StackTraceElement[] stack = (new Throwable()).getStackTrace();
StackTraceElement caller;
if(stack.length>2){
caller = stack[2];
}else{
return false;
}
String className = caller.getClassName();
System.out.println(className);
for(String str :safeClass){
if(className.equals(str)){
return true;
}
}
return false;
}
}
public class Client {
public static void main(String[] args) {
ProtectionProxy proxy = new ProtectionProxy();
VirtualProxy virtualProxy = new VirtualProxy();
virtualProxy.draw();
proxy.draw();
}
}