1. 程式人生 > >常用設計模式之代理模式解析

常用設計模式之代理模式解析

1.  簡介

     代理模式(Proxy Pattern)是常用設計模式之一。代理模式的定義:Provide a surrogate or placeholder for another object to controlaccess to it(為其他物件提供一種代理以控制對這個物件的訪問)。使用代理模式建立代理物件,讓代理物件控制目標物件的訪問(目標物件可以是遠端的物件、建立開銷大的物件或需要安全控制的物件),並且可以在不改變目標物件的情況下新增一些額外的功能。

2.  UML類圖

    

3.  模式中包含的角色及其職責

Subject:抽象主題角色,抽象主題類可以是抽象類,也可以是介面,是一個最普通的業務型別定義,無特殊要求。

RealSubject:具體主題角色,也叫被委託角色、被代理角色。是業務邏輯的具體執行者。

Proxy:代理主題角色,也叫委託類、代理類。它把所有抽象主題類定義的方法給具體主題角色實現,並且在具體主題角色處理完畢前後做預處理和善後工作。(最簡單的比如列印日誌)

4.  程式碼實現

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

//介面類 計算介面  Subject:抽象主題角色

interface  ICal { 

   public int  Cal(int a,int b); 

 

 //  加法實現   RealSubject:具體主題角色

class ClassAdd  

implements  ICal { 

    @Override 

    public int  Cal(int a,int b){ 

         System.out.println("ClassAdd!"); 

         return a+b;

  

 

//  普通代理類 Proxy:代理主題角色

class ClassAddProxy  implements  ICal { 

    private ICal calObject;

    public ClassAddProxy(ICal cal){

        this.calObject=cal;

    }

 

   @Override 

   public int  Cal(int a,int b){ 

        System.out.println("before....");

         int result=    calObject.Cal(a, b);

        System.out.println("after....");

        return result;

 

}

 

 /**

* 測試類

 */ 

class TestProxy { 

   public static void main(String[] args) { 

       //建立加法類的處理物件 

       ClassAddProxy addProxy=new ClassAddProxy(new ClassAdd());

       int result=addProxy.Cal(6,4);

       System.out.println(result); 

   

  

執行結果:

before....
ClassAdd!
after....
10

  

5.   應用場景

現實世界中,祕書就相當於一個代理,老闆開會,那麼通知員工開會時間、佈置會場、會後整理會場等等開會相關工作就可以交給祕書做,老闆就只需要開會就行了,不需要親自做那些事。同理,在我們程式設計中也可使用代理模式來將由一系列無關邏輯組合在一起的程式碼進行解耦合,比如業務程式碼中的日誌程式碼就可以在代理中進行。Spring的AOP就是典型的動態代理應用。

6.   代理模式的應用形式

(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),這不難理解。複雜隱藏代理和外觀模式是不一樣的,因為代理控制訪問,而外觀模式是不一樣的