Java代理模式

來源:互聯網
上載者:User

1.  簡介

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

2.  UML類圖

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

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

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

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

4.  代碼實現

(1)    Subject

package com.jackie.designpatterns.proxy;

/**

 *
抽象主題,定義主要功能

 */

publicinterface Subject {

   publicvoid operate();

}

(2)    RealSubject

package com.jackie.designpatterns.proxy;

/**

 *
具體主題

 */

publicclass RealSubject
implements Subject{

 

   @Override

   publicvoid operate() {

        System.out.println("realsubject operatestarted......");

   }

}

(3)     Proxy

package com.jackie.designpatterns.proxy;

/**

 *
代理類

 */

publicclass Proxy
implements Subject{

 

   private Subject
subject;

 

   public Proxy(Subject subject) {

        this.subject = subject;

   }

 

   @Override

   publicvoid operate() {

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

        subject.operate();

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

   }

}

(4)     Client

package com.jackie.designpatterns.proxy;

/**

 *
客戶

 */

publicclass Client {

   /**

    * @param args

    */

   publicstaticvoid main(String[] args) {

        Subject subject =
new
RealSubject();

        Proxy proxy = new Proxy(subject);

        proxy.operate();

   }

}

運行結果:    
beforeoperate......

realsubject operate started......

afteroperate......

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),這不難理解。複雜隱藏代理和面板模式是不一樣的,因為代理控制訪問,而面板模式是不一樣的,因為代理控制訪問,而面板模式只提供另一組介面。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.