代理模式
一 場景
在軟體開發中,有時候需要訪問遠程jvm中的物件,我們可以在本地jvm中創建一個代理物件,用這個代理物件將網路細節封裝起來,使得客戶端不必考慮網路的存在,客戶端訪問遠程jvm物件就像呼叫本地物件一樣,這就是代理模式的遠程代理,
有時候程式創建的一些物件,十分消耗系統資源,這些物件的加載時間很長,我們可以創建一個不耗資源的虛擬物件,在真實物件完成創建之前,我們使用虛擬物件來代替真實物件,這種創建虛擬物件臨時代替真實物件的方式,就是代理模式的虛擬代理,
我們在訪問的一些物件時,有時候需要進行一些權限的控制,其實可以專門創建一個新物件,把權限的控制的邏輯放到新物件中,這樣程式就把權限控制和物件訪問分開,實作了一定程度的解耦,這就是代理模式的保護代理,
二 定義
代理模式給一個物件提供一個替身或占位符,來控制對原物件的訪問,代理模式是一種物件結構型模式,
三 類圖

Subject(抽象主題類):抽象主題類是真實主題類和代理類的共同介面,通過實作同一介面,代理類可以在真實主題類出現任何地方取代它,
RealSubject(真實主題類):真實主題類是真正做事的物件,它實作了具體的業務邏輯操作,它是一個被代理類控制和訪問的物件,
Proxy(代理類):代理類包含了對真實主題類的參考,由于它和真實主題類實作了相同的介面,所以在任何用到真實主題類的地方,都可以被代理類取代,代理類可以控制真實主題類的訪問,客戶端可以通過訪問代理類,來間接呼叫真實主題類的操作,
四 代碼示例
現在社會上代購十分流行,我們以代購為例,假設顧客需要購買某個商品,但是顧客所在的城市A沒有這個商品,而顧客的好朋友所在的城市B卻有這個商品,顧客就可以委托他的好友在城市B給他購買這個商品,然后朋友再通過物流托運給這個顧客,顧客托朋友的購物行為就是代購,
代購這種行為場景和代理模式十分吻合,顧客的好朋友是真正買東西的人,而顧客的購物行為其實是委托給了好友在買東西,
顧客和顧客的好友都具有購買的行為,所有定義了一個抽象的主題類的介面IShopping,介面中宣告了一個buy方法,

顧客的好友其實就是代購,所以定義了Shopper類實作了IShopping介面,它是真實主題類,Shopper類中實作了IShopping介面的buy方法,Shopper類真正具有購買東西的行為,

顧客也有購買的行為,但是顧客的購買行為其實是委托給了好友來完成,我們定義了一個Customer類,也實作了IShopping介面,并在Customer類中宣告了一個Shopper類的實體,Customer類在實作IShopping介面的buy方法時,其實是呼叫了Shopper實體的buy方法,


運行結果

五 總結
代理模式是一種物件結構型模式,它能將代理物件與真實被呼叫的目標物件分離,降低了系統的耦合性,同時具有很好的擴展性,
優點:
- 代理模式中代理類和真實主題類都是對抽象主題類進行編碼,都實作了抽象主題的介面,而代理類和真實主題類并沒有直接關聯,從而降低了耦合性,
- 真實主題類中修改了代碼的情況下,而代理類不需要跟著修改源代碼,符合了“開閉原則”,
缺點:
- 在客戶端和真實主題之間增加了代理類,因此有可能會造成請求的處理速度變慢,
- 實作代理模式需要增加一些額外的作業,而且有些代理模式的實作程序較為復雜,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460866.html
標籤:其他
上一篇:代理模式
下一篇:加入最近的時間戳?快速SQL
