大話設計模式(二)代理模式
大話設計模式(二)代理模式
前言
代理模式(Proxy Pattern)是GoF 23種Java常用設計模式之一。代理模式的定義:Provide a surrogate or placeholder for another object to control?access to it(為其他對象提供一種代理以控制對這個對象的訪問)。使用代理模式創建代理對象,讓代理對象控制目標對象的訪問(目標對象可以是遠程的對象、創建開銷大的對象或需要安全控制的對象),并且可以在不改變目標對象的情況下添加一些額外的功能。
UML類圖
角色及其職責
抽象角色:聲明真實對象和代理對象的共同接口;
代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當于對真實對象進行封裝。
真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
舉例
下面以一個淺顯的例子進行介紹:Proxy喜歡班上的一個女生,但他又不好意思親自說,于是Proxy請Proxy_幫忙送花,送巧克力等。
問題的解決:“Proxy”和“Proxy_”的方法有相似之處,只不過“Proxy_”送的禮物是“Proxy”買的。
碼上說明
package cn.edu.ujn.designpattern;
//公共接口類
interface GiveGift
{
public void givedolls();
public void giveflowers();
public void givechocolate();
}
//被追求者類
class SchoolGirl
{
private String name;
public SchoolGirl(String girlName) {
this.name = girlName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 追求者類
class Pursuit implements GiveGift {
SchoolGirl mm;
public Pursuit(SchoolGirl mm) {
this.mm = mm;
}
@Override
public void givedolls() {
System.out.println(mm.getName() + ",送你洋娃娃");
}
@Override
public void giveflowers() {
System.out.println(mm.getName() + ",送你鮮花");
}
@Override
public void givechocolate() {
System.out.println(mm.getName() + ",送你巧克力");
}
}
// 代理類
class Proxy_ implements GiveGift
{
Pursuit gg;
public Proxy_(SchoolGirl mm){
gg = new Pursuit(mm);
}
@Override
public void givedolls() {
gg.givedolls();
}
@Override
public void giveflowers() {
gg.giveflowers();
}
@Override
public void givechocolate() {
gg.givechocolate();
}
}
public class Proxy{
public static void main(String[] args) {
SchoolGirl girl = new SchoolGirl("Proxy");
Proxy_ demo = new Proxy_(girl);
demo.givedolls();
demo.giveflowers();
demo.givechocolate();
}
}
代理模式結構圖如下:
應用場景
現實世界中,秘書就相當于一個代理,老板開會,那么通知員工開會時間、布置會場、會后整理會場等等開會相關工作就可以交給秘書做,老板就只需要開會就行了,不需要親自做那些事。同理,在我們程序設計中也可使用代理模式來將由一系列無關邏輯組合在一起的代碼進行解耦合,比如業務代碼中的日志代碼就可以在代理中進行。spring的AOP就是典型的動態代理應用。
應用形式
(1)遠程代理(Remote Proxy)?-可以隱藏一個對象存在于不同地址空間的事實。也使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。
(2)虛擬代理(Virtual Proxy) – 允許內存開銷較大的對象在需要的時候創建。只有我們真正需要這個對象的時候才創建。
(3)寫入時復制代理(Copy-On-Write Proxy)?– 用來控制對象的復制,方法是延遲對象的復制,直到客戶真的需要為止。是虛擬代理的一個變體。
(4)保護代理(Protection (Access)Proxy)?– 為不同的客戶提供不同級別的目標對象訪問權限。
(5)緩存代理(Cache Proxy)?– 為開銷大的運算結果提供暫時存儲,它允許多個客戶共享結果,以減少計算或網絡延遲。
(6)防火墻代理(Firewall Proxy) – 控制網絡資源的訪問,保護主題免于惡意客戶的侵害。
(7)同步代理(SynchronizationProxy) – 在多線程的情況下為主題提供安全的訪問。
(8)智能引用代理(Smart ReferenceProxy)?- 當一個對象被引用時,提供一些額外的操作,比如計算真實對象的引用次數,這樣當該對象沒有引用時,可以自動釋放它;或當第一次引用一個持久對象時,將它裝入內存;或在訪問一個實際對象前,檢查是否已經鎖定它,以確保其他對象不能改變它。
(9)復雜隱藏代理(Complexity HidingProxy)?– 用來隱藏一個類的復雜集合的復雜度,并進行訪問控制。有時候也稱為外觀代理(Fa?ade Proxy),這不難理解。復雜隱藏代理和外觀模式是不一樣的,因為代理控制訪問,而外觀模式只提供另一組接口。
優缺點
優點:詳見代理的分類
1)在一定程度上降低了系統的耦合度。
2)代理模式在客戶端和目標對象之間起到一個中介作用,這樣可以起到保護目標對象的作用。代理對象也可以對目標對象調用之前進行其他操作。
缺點:
1)在客戶端和目標對象增加一個代理對象,會造成請求處理速度變慢。
2)增加了系統的復雜度。
美文美圖
網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。