Java設計模式之虛擬代理模式

來源:互聯網
上載者:User

虛擬代理模式(Virtual Proxy)是一種節省記憶體的技術,它建議建立那些佔用大量記憶體或處理複雜的對象時,把建立這類對象延遲到使用它的時候。在特定的應用中,不同部分的功能由不同的對象組成,應用啟動的時候,不會立即使用所有的對象。在這種情況下,虛擬代理模式建議延遲對象的建立直到應用程式需要它為止。對象被應用第一次引用時建立並且同一個執行個體可以被重用。這種方法優缺點並存。

優點:

這種方法的優點是,在應用程式啟動時,由於不需要建立和裝載所有的對象,因此加速了應用程式的啟動。

缺點:

因為不能保證特定的應用程式物件被建立,在訪問這個對象的任何地方,都需要檢測確認它不是空(null)。也就是,這種檢測的時間消耗是最大的缺點。

應用虛擬代理模式,需要設計一個與真實對象具有相同介面的單獨對象(指虛擬代理)。不同的客戶對象可以在建立和使用真實對象地方用相應的虛擬對象來代替。虛擬對象把真實對象的引用作為它的執行個體變數維護。代理對象不要自動建立真實對象,當客戶需要真實對象的服務時,調用虛擬代理對象上的方法,並且檢測真實對象是否被建立。

如果真實對象已經建立,代理把調用轉寄給真實對象,如果真實對象沒有被建立:

1) 代理對象建立真實對象

2) 代理對象把這個對象分配給引用變數。

3) 代理把調用轉寄給真實對象

按照這種安排,驗證對象存在和轉寄方法調用這些細節對於客戶是不可見的。客戶對象就像和真實對象一樣與代理對象進行互動。因此客戶從檢測真實對象是否為null中解脫出來,另外,由於建立代理對象在時間和處理複雜度上要少於建立真實對象。因此,在應用程式啟動的時候,用代理對象代替真實對象初始化。

例子:

假設我們建立一個JAVA程式的整合式開發環境(Integrated Development Environment),這個環境包括三個功能:編譯、運行、產生JavaDoc文檔。在建立和編輯Java程式時,最為常用的是編譯和運行。至於產生JavaDoc文檔對於每一個Java程式不是必需的。因此,在Java開發環境啟動時,不要建立和裝載實現整合式開發環境全部功能的所有對象,僅建立那些在編輯、編譯、運行時用到的對象,保留提供產生JavaDoc文檔的對象,這是一個好的設計思想。這種對象建立策略能夠高效地利用記憶體空間並且加快了整合式開發環境的啟動速度。

假設編譯、運行、產生JavaDoc文檔這些功能分別由三個工具類提供??Compiler、Runtime和JavaDoc。客戶對象可以訪問的不同IDE操作的介面以抽象類別IDEOperation的形式定義。

public abstract class IDEOperation {
 private Compiler cmp;
 private Runtime rtime;
 public void compile(String javaFile) {
  cmp.compile(javaFile);
 }
 public void run(String classFile) {
  rtime.run (classFile);
 }
 //to be delayed until needed.
 public abstract void generateDocs(String javaFile);
 public IDEOperation() {
  cmp = new Compiler();
  rtime = new Runtime();
 }
}

類IDEOperation提供了編譯、運行java程式方法的實現,作為它建構函式的一部分,IDEOperation建立和裝載了進行編譯和執行操作的Compiler和Runtime對象。產生JavaDoc文檔的方法generateDocs方法被設計成抽象的方法,由它的子類來實現。

讓我們定義抽象類別IDEOperation的一個具體子類RealProcessor。作為RealProcessor建構函式的一部分,建立JavaDoc對象來提供產生JavaDoc文檔的服務,通過使用JavaDoc對象功能實現generateDocs方法。

public class RealProcessor extends IDEOperation {
 JavaDoc jdoc;
 public RealProcessor() {
  super();
  jdoc = new JavaDoc();
 }
 public void generateDocs(String javaFile) {
  jdoc.generateDocs(javaFile);
 }
}

通過上面的實現,RealProcessor類包含了編譯、運行和產生JavaDoc文檔的所有功能。像我們原來討論的,產生JavaDoc文檔的功能不是每一個Java程式所必須的,當RealProcessor執行個體化的時候,包括負責產生JavaDoc文檔的JavaDoc對象的一系列對象被建立。延遲建立JavaDoc對象有以下優點:

1) 加速了RealProcessor對象的建立時間,因為它的建構函式建立的很少的對象。

2) 高效地利用記憶體,因為在不需要物件服務的時候,不需要把對象保持在記憶體中。

在不改變RealProcessor實現的前提下,可以通過定義IDEOperation的另外一個子類ProxyProcessor來實現虛擬代理。因為RealProcessor和ProxyProcessor共用相同的介面,客戶對象可以用ProxyProcesso

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.