代理模式一遍涉及的角色有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{@Overridepublic void request() { // TODO Auto-generated method stubSystem.out.println("This is my real Request..."); }}public class Proxy extends Subject { /** Proxy中會包含對RealSubject的引用**/private RealSubject realSubject ;@Overridepublic 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();} }