代理模式一遍涉及的角色有
1.抽象角色:声明真实对象和代理对象的共同接口
2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作
真实对象,同时代理对象提供与真实对象相同的接口以便在任何时候都能够代替真实对象。同时代理对象可以在执行真实对象操作时,附加其他操作,想当于对真实对象进行封装。
3.真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
4.客户需要调用的是RealSubject中的request方法,现在使用ProxySubject来代理Realsubject类,同样达到了目的,同时还封装了其他方法(preRequest,afterRequest),可以处理一些其他问题。
5.另外,如果要按照上述方法使用代理模式,那么真实的角色必须是已经存在了的,并将其作为代理对象的内部属性。但是实际使用的时候i,一个真实角色必须对应一个代理角色,如果大量使用会导致类得极具膨胀;此外如果事先并不知道真实角色,那么该如何使用代理?这个问题可以通过Java的动态代理类来解决。

/**
* Proxy.java
* proxy
*
* Function: TODO
*
* ver date author
* ──────────────────────────────────
* 2011-6-8 Leon
*
* Copyright (c) 2011, TNT All Rights Reserved.
*/
package proxy;
/**
* ClassName:Proxy
* Function: TODO ADD FUNCTION
* Reason: TODO ADD REASON
*
* @author Leon
* @version
* @since Ver 1.1
* @Date 2011-6-8
*/
abstract class Subject {
public abstract void request() ;
}
class RealSubject extends Subject{
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("This is my real Request...");
}
}
public class Proxy extends Subject {
/** Proxy中会包含对RealSubject的引用**/
private RealSubject realSubject ;
@Override
public void request() {
// TODO Auto-generated method stub
//调用真实之前(optional)
this.preRequest();
if(realSubject==null){
//调用真实角色
realSubject = new RealSubject();
}
realSubject.request();
//调用真实之后(optional)
this.afterRequest();
}
private void preRequest(){
System.out.println("before real request.....");
}
private void afterRequest(){
System.out.println("after the real request......");
}
public static void main(String... args){
Subject subject = new Proxy();
subject.request();
}
}