<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #代理模式(Proxy pattern) ##簡介 代理模式(英語:Proxy Pattern)是程序設計中的一種設計模式。 所謂的代理者是指一個類可以作為其它東西的接口。代理者可以作任何東西的接口:網絡連接、內存中的大對象、文件或其它昂貴或無法復制的資源。 著名的代理模式例子為引用計數(英語:reference counting)指針對象。 當一個復雜對象的多份副本須存在時,代理模式可以結合享元模式以減少內存用量。典型作法是創建一個復雜對象及多個代理者,每個代理者會引用到原本的復雜對象。而作用在代理者的運算會轉送到原本對象。一旦所有的代理者都不存在時,復雜對象會被移除。 *** 在某些情況下,一個客戶不想或者不能直接引用一個對象,此時可以通過一個稱之為“代理”的第三者來實現 間接引用。代理對象可以在客戶端和目標對象之間起到 中介的作用,并且可以通過代理對象去掉客戶不能看到 的內容和服務或者添加客戶需要的額外服務。 通過引入一個新的對象(如小圖片和遠程代理 對象)來實現對真實對象的操作或者將新的對 象作為真實對象的一個替身,這種實現機制即 為代理模式,通過引入代理對象來間接訪問一 個對象,這就是代理模式的模式動機。 ##講解 ``` #include <iostream> #include "RealSubject.h" #include "Proxy.h" using namespace std; int main(int argc, char *argv[]) { Proxy proxy; proxy.request(); return 0; } ``` ``` /////////////////////////////////////////////////////////// // Proxy.h // Implementation of the Class Proxy // Created on: 07-十月-2014 16:57:54 // Original author: colin /////////////////////////////////////////////////////////// #if !defined(EA_56011290_0413_40c6_9132_63EE89B023FD__INCLUDED_) #define EA_56011290_0413_40c6_9132_63EE89B023FD__INCLUDED_ #include "RealSubject.h" #include "Subject.h" class Proxy : public Subject { public: Proxy(); virtual ~Proxy(); void request(); private: void afterRequest(); void preRequest(); RealSubject *m_pRealSubject; }; #endif // !defined(EA_56011290_0413_40c6_9132_63EE89B023FD__INCLUDED_) ``` ``` /////////////////////////////////////////////////////////// // Proxy.cpp // Implementation of the Class Proxy // Created on: 07-十月-2014 16:57:54 // Original author: colin /////////////////////////////////////////////////////////// #include "Proxy.h" #include <iostream> using namespace std; Proxy::Proxy(){ //有人覺得 RealSubject對象的創建應該是在main中實現;我認為RealSubject應該 //對用戶是透明的,用戶所面對的接口都是通過代理的;這樣才是真正的代理; m_pRealSubject = new RealSubject(); } Proxy::~Proxy(){ delete m_pRealSubject; } void Proxy::afterRequest(){ cout << "Proxy::afterRequest" << endl; } void Proxy::preRequest(){ cout << "Proxy::preRequest" << endl; } void Proxy::request(){ preRequest(); m_pRealSubject->request(); afterRequest(); } ``` ###優點 * 代理模式能夠協調調用者和被調用者,在一定程度上降低了系 統的耦合度。 * 遠程代理使得客戶端可以訪問在遠程機器上的對象,遠程機器 可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。 * 虛擬代理通過使用一個小對象來代表一個大對象,可以減少系 統資源的消耗,對系統進行優化并提高運行速度。 * 保護代理可以控制對真實對象的使用權限。 ###缺點 * 由于在客戶端和真實主題之間增加了代理對象,因此 有些類型的代理模式可能會造成請求的處理速度變慢。 * 實現代理模式需要額外的工作,有些代理模式的實現 非常復雜。 ###適用環境 根據代理模式的使用目的,常見的代理模式有以下幾種類型: * 遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個本地 的代理對象,這個不同的地址空間可以是在同一臺主機中,也可是在 另一臺主機中,遠程代理又叫做大使(Ambassador)。 * 虛擬(Virtual)代理:如果需要創建一個資源消耗較大的對象,先創建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創建。 * Copy-on-Write代理:它是虛擬代理的一種,把復制(克隆)操作延遲 到只有在客戶端真正需要時才執行。一般來說,對象的深克隆是一個 開銷較大的操作,Copy-on-Write代理可以讓這個操作延遲,只有對象被用到的時候才被克隆。 * 保護(Protect or Access)代理:控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權限。 * 緩沖(Cache)代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。 * 防火墻(Firewall)代理:保護目標不讓惡意用戶接近。 * 同步化(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突。 * 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,如將此對象被調用的次數記錄下來等。 ##實例 圖片懶加載是一個很典型的代理模式的例子。 ``` //抽象日志記錄類:抽象主題 interface AbstractLog { public void method(); } ``` ``` import java.util.*; //日志記錄代理類:代理主題 class LoggerProxy implements AbstractLog { private BusinessClass business; public LoggerProxy() { business = new BusinessClass(); } public void method() { Calendar calendar = new GregorianCalendar(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAY_OF_MONTH); int hour = calendar.get(Calendar.HOUR) + 12; int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); String dateTime = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second + "!"; System.out.println("方法method()被調用,調用時間為" + dateTime); try{ business.method(); System.out.println("方法method()調用成功!"); } catch(Exception e) { System.out.println("方法method()調用失敗!"); } } } ``` ``` //業務類:真實主題 class BusinessClass implements AbstractLog { public void method() { System.out.println("真實業務方法!"); } } ``` ``` //客戶端測試類 class Client { public static void main(String args[]) { AbstractLog al; al = new LoggerProxy(); al.method(); } } ``` 在本實例中,通過代理類LoggerProxy來間接調用真實業務類BusinessClass的方法,可以在調用真實業務方法時增加新功能(如日志記錄),此處使用的是代理模式的一種較為簡單的形式,類似于保護代理,在實施真實調用時可以執行一些額外的操作。由于代理主題和真實主題實現了相同的接口,因此在客戶端可以針對抽象編程,而將具體代理類類名存儲至配置文件中,增加和更換代理類和真實類都很方便,無需修改源代碼,滿足開閉原則。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看