小A:“代理模式一般涉及到哪些角色?”
大B:“抽象角色:聲明真實對象和代理對象的共同接口;代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。”
使用類圖來表示下三者間的關係:
abstractpublicclassSubject
{
abstractpublicvoidrequest();
}
真實角色:實現了Subject的request()方法。
publicclassRealSubjectextendsSubject
{
publicRealSubject()
{
}
publicvoidrequest()
{
System.out.println(“Fromrealsubject.”);
}
}
代理角色:
publicclassProxySubjectextendsSubject
{
privateRealSubjectrealSubject;//以真實角色作爲代理角色的屬性
publicProxySubject()
{
}
publicvoidrequest()//該方法封裝了真實對象的request方法
{
preRequest();
if(realSubject……null)
{
realSubject=newRealSubject();
}
realSubject.request();//此處執行真實對象的request方法
postRequest();
}
privatevoidpreRequest()
{
//somethingyouwanttodobeforerequesting
}
privatevoidpostRequest()
{
//somethingyouwanttodoafterrequesting
}
}
客戶端調用:
Subjectsub=newProxySubject();
Sub.request();
大B:“由以上代碼可以看出,客戶實際需要調用的是RealSubject類的request()方法,現在用ProxySubject來代理RealSubject類,同樣達到目的,同時還封裝了其他方法(preRequest(),postRequest()),可以處理一些其他問題。另外,如果要按照上述的方法使用代理模式,那麼真實角色必須是事先已經存在的,並將其作爲代理對象的內部屬性。但是實際使用時,一個真實角色必須對應一個代理角色,如果大量使用會導致類的急劇膨脹。”
小A:“如果事先並不知道真實角色,該如何使用代理呢?”
大B:“這個問題可以通過Java的動態代理類來解決。”