<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java Source

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      14 Posts :: 24 Stories :: 8 Comments :: 0 Trackbacks

    虛擬代理模式(Virtual Proxy)是一種節(jié)省內(nèi)存的技術(shù),它建議創(chuàng)建那些占用大量?jī)?nèi)存或處理復(fù)雜的對(duì)象時(shí),把創(chuàng)建這類對(duì)象推遲到使用它的時(shí)候。在特定的應(yīng)用中,不同部分的功能 由不同的對(duì)象組成,應(yīng)用啟動(dòng)的時(shí)候,不會(huì)立即使用所有的對(duì)象。在這種情況下,虛擬代理模式建議推遲對(duì)象的創(chuàng)建直到應(yīng)用程序需要它為止。對(duì)象被應(yīng)用第一次引 用時(shí)創(chuàng)建并且同一個(gè)實(shí)例可以被重用。這種方法優(yōu)缺點(diǎn)并存。

      優(yōu)點(diǎn):

      這種方法的優(yōu)點(diǎn)是,在應(yīng)用程序啟動(dòng)時(shí),由于不需要?jiǎng)?chuàng)建和裝載所有的對(duì)象,因此加速了應(yīng)用程序的啟動(dòng)。

      缺點(diǎn):

      因?yàn)椴荒鼙WC特定的應(yīng)用程序?qū)ο蟊粍?chuàng)建,在訪問(wèn)這個(gè)對(duì)象的任何地方,都需要檢測(cè)確認(rèn)它不是空(null)。也就是,這種檢測(cè)的時(shí)間消耗是最大的缺點(diǎn)。

       應(yīng)用虛擬代理模式,需要設(shè)計(jì)一個(gè)與真實(shí)對(duì)象具有相同接口的單獨(dú)對(duì)象(指虛擬代理)。不同的客戶對(duì)象可以在創(chuàng)建和使用真實(shí)對(duì)象地方用相應(yīng)的虛擬對(duì)象來(lái)代 替。虛擬對(duì)象把真實(shí)對(duì)象的引用作為它的實(shí)例變量維護(hù)。代理對(duì)象不要自動(dòng)創(chuàng)建真實(shí)對(duì)象,當(dāng)客戶需要真實(shí)對(duì)象的服務(wù)時(shí),調(diào)用虛擬代理對(duì)象上的方法,并且檢測(cè)真 實(shí)對(duì)象是否被創(chuàng)建。

      如果真實(shí)對(duì)象已經(jīng)創(chuàng)建,代理把調(diào)用轉(zhuǎn)發(fā)給真實(shí)對(duì)象,如果真實(shí)對(duì)象沒(méi)有被創(chuàng)建:

      1) 代理對(duì)象創(chuàng)建真實(shí)對(duì)象

      2) 代理對(duì)象把這個(gè)對(duì)象分配給引用變量。

      3) 代理把調(diào)用轉(zhuǎn)發(fā)給真實(shí)對(duì)象

       按照這種安排,驗(yàn)證對(duì)象存在和轉(zhuǎn)發(fā)方法調(diào)用這些細(xì)節(jié)對(duì)于客戶是不可見(jiàn)的。客戶對(duì)象就像和真實(shí)對(duì)象一樣與代理對(duì)象進(jìn)行交互。因此客戶從檢測(cè)真實(shí)對(duì)象是否為 null中解脫出來(lái),另外,由于創(chuàng)建代理對(duì)象在時(shí)間和處理復(fù)雜度上要少于創(chuàng)建真實(shí)對(duì)象。因此,在應(yīng)用程序啟動(dòng)的時(shí)候,用代理對(duì)象代替真實(shí)對(duì)象初始化。

      例子:

       假設(shè)我們建立一個(gè)JAVA程序的集成開(kāi)發(fā)環(huán)境(Integrated Development Environment),這個(gè)環(huán)境包括三個(gè)功能:編譯、運(yùn)行、生成JavaDoc文檔。在新建和編輯Java程序時(shí),最為常用的是編譯和運(yùn)行。至于生成 JavaDoc文檔對(duì)于每一個(gè)Java程序不是必需的。因此,在Java開(kāi)發(fā)環(huán)境啟動(dòng)時(shí),不要?jiǎng)?chuàng)建和裝載實(shí)現(xiàn)集成開(kāi)發(fā)環(huán)境全部功能的所有對(duì)象,僅創(chuàng)建那些 在編輯、編譯、運(yùn)行時(shí)用到的對(duì)象,保留提供生成JavaDoc文檔的對(duì)象,這是一個(gè)好的設(shè)計(jì)思想。這種對(duì)象創(chuàng)建策略能夠高效地利用內(nèi)存空間并且加快了集成 開(kāi)發(fā)環(huán)境的啟動(dòng)速度。

      假設(shè)編譯、運(yùn)行、生成JavaDoc文檔這些功能分別由三個(gè)工具類提供??Compiler、Runtime和JavaDoc??蛻魧?duì)象可以訪問(wèn)的不同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提供了編譯、運(yùn)行java程序方法的實(shí)現(xiàn),作為它構(gòu)造函數(shù)的一部分,IDEOperation創(chuàng)建和裝載了進(jìn)行編譯和執(zhí)行操 作的Compiler和Runtime對(duì)象。生成JavaDoc文檔的方法generateDocs方法被設(shè)計(jì)成抽象的方法,由它的子類來(lái)實(shí)現(xiàn)。

      讓我們定義抽象類IDEOperation的一個(gè)具體子類RealProcessor。作為RealProcessor構(gòu)造函數(shù)的一部分,創(chuàng)建JavaDoc對(duì)象來(lái)提供生成JavaDoc文檔的服務(wù),通過(guò)使用JavaDoc對(duì)象功能實(shí)現(xiàn)generateDocs方法。

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

       通過(guò)上面的實(shí)現(xiàn),RealProcessor類包含了編譯、運(yùn)行和生成JavaDoc文檔的所有功能。像我們?cè)瓉?lái)討論的,生成JavaDoc文檔的功能 不是每一個(gè)Java程序所必須的,當(dāng)RealProcessor實(shí)例化的時(shí)候,包括負(fù)責(zé)生成JavaDoc文檔的JavaDoc對(duì)象的一系列對(duì)象被創(chuàng)建。 推遲創(chuàng)建JavaDoc對(duì)象有以下優(yōu)點(diǎn):

      1) 加速了RealProcessor對(duì)象的創(chuàng)建時(shí)間,因?yàn)樗臉?gòu)造函數(shù)創(chuàng)建的很少的對(duì)象。

      2) 高效地利用內(nèi)存,因?yàn)樵诓恍枰獙?duì)象服務(wù)的時(shí)候,不需要把對(duì)象保持在內(nèi)存中。

       在不改變RealProcessor實(shí)現(xiàn)的前提下,可以通過(guò)定義IDEOperation的另外一個(gè)子類ProxyProcessor來(lái)實(shí)現(xiàn)虛擬代理。 因?yàn)镽ealProcessor和ProxyProcessor共享相同的接口,客戶對(duì)象可以用ProxyProcessor代替 RealProcessor。圖25.1展示了類層次;

     

    Figure 25.1: IDEOperation Class Hierarchy

    public class ProxyProcessor extends IDEOperation {
     private RealProcessor realProcessor;
     public void generateDocs(String javaFile) {
      /*
      In order to generate javadocs
      the proxy loads the actual object and
      invokes its methods.
      */
      if (realProcessor == null) {
       realProcessor = new RealProcessor();
      }
      realProcessor.generateDocs(javaFile);
     }
    }

       作為自己的實(shí)例變量,ProxyProcessor維護(hù)了RealProcessor對(duì)象的一個(gè)引用。作為generateDocs方法的一部分, ProxyProcessor檢測(cè)引用變量是否被初始化為RealProcessor對(duì)象。如果沒(méi)有被初始化,它創(chuàng)建一個(gè)RealProcessor對(duì)象 并把這個(gè)對(duì)象分配給它的實(shí)例變量。一旦RealProcessor對(duì)象已經(jīng)被創(chuàng)建,就調(diào)用其上的generateDocs方法。

      實(shí)際上,也就是當(dāng)客戶對(duì)象第一次請(qǐng)求產(chǎn)生javadoc文檔時(shí),RealProcessor才被初始化裝入內(nèi)存中。反過(guò)來(lái),直到客戶需要為Java程序生成javadocs時(shí),JavaDoc對(duì)象才會(huì)被創(chuàng)建和裝入內(nèi)存中。

      客戶對(duì)象像調(diào)用真實(shí)處理對(duì)象一樣調(diào)用ProxyProcessor上的方法,并不需要關(guān)心(知道)RealProcessor對(duì)象是否存在。 至于驗(yàn)證、檢測(cè)和ProxyProcessor和RealProcessor之間的交互、這樣的細(xì)節(jié)對(duì)于客戶對(duì)象是透明的。

    public class Client {
     public static void main(String[] args) {
      /*
      At this point objects required for
      the compile and run operations are
      created, but not the objects that provide the
      generate Javadoc functionality.
      */
      IDEOperation IDE = new ProxyProcessor();
      IDE.compile("test.java");
      IDE.run("test.class");
      /*
      The Javadoc functionality is accessed
      For the first time and hence the
      Object offering the Javadoc generation
      Functionality is loaded at this point.
      */
      IDE.generateDocs("test.java");
     }
    }
    posted on 2005-11-15 14:21 JustinLei 閱讀(258) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 日韩在线一区二区三区免费视频| 亚洲成av人片在线看片| 国产又黄又爽又刺激的免费网址 | 亚洲第一页在线视频| 亚洲国产成人久久综合碰碰动漫3d| 亚洲色精品aⅴ一区区三区| 亚洲色欲色欲www在线丝| 亚洲熟妇中文字幕五十中出| 精品国产综合成人亚洲区| 亚洲国产成人片在线观看无码| 久久精品国产亚洲麻豆| 亚洲av伊人久久综合密臀性色 | 免费人妻av无码专区| 亚洲福利视频一区二区| 中文字幕亚洲一区二区三区| 亚洲日韩欧洲乱码AV夜夜摸 | 成人爽A毛片免费看| 四虎免费在线观看| 波多野结衣免费视频观看| 国产成人麻豆亚洲综合无码精品| 国产亚洲成AV人片在线观黄桃| 国产国拍亚洲精品mv在线观看| 亚洲成熟xxxxx电影| 亚洲国产精品久久久久秋霞影院 | 蜜芽亚洲av无码精品色午夜| 亚洲天堂一区在线| 亚洲爆乳精品无码一区二区| 污网站免费在线观看| 国产三级在线免费| 国产一精品一AV一免费孕妇| 四虎影视在线永久免费看黄| 国产午夜亚洲不卡| 亚洲AV无码不卡无码| 亚洲午夜一区二区三区| 污网站免费在线观看| 无码国产精品一区二区免费vr | 777爽死你无码免费看一二区| 国产精品美女午夜爽爽爽免费| 免费国产不卡午夜福在线| 久久精品国产亚洲综合色| 亚洲制服丝袜第一页|