欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析設計模式中的代理模式在C++編程中的運用

 更新時間:2016年03月09日 11:32:53   作者:黃花寒  
這篇文章主要介紹了設計模式中的代理模式在C++編程中的運用,代理模式最大的好處就是實現了邏輯和實現的徹底解耦,需要的朋友可以參考下

由遇到的問題引出代理模式

至少在以下集中情況下可以用代理模式解決問題:

  • 創(chuàng)建開銷大的對象時候,比如顯示一幅大的圖片,我們將這個創(chuàng)建的過程交給代理去完成,GoF 稱之為虛代理(Virtual Proxy);
  • 為網絡上的對象創(chuàng)建一個局部的本地代理,比如要操作一個網絡上的一個對象(網絡性能不好的時候,問題尤其突出),我們將這個操縱的過程交給一個代理去完成,GoF 稱之為遠程代理(Remote Proxy);
  • 對對象進行控制訪問的時候,比如在 Jive 論壇中不同權限的用戶(如管理員、普通用戶等)將獲得不同層次的操作權限,我們將這個工作交給一個代理去完成,GoF 稱之為保護代理(Protection Proxy)。

UML 圖:

201639113131363.jpg (405×252)

角色:

  •        Subject: 抽象角色。聲明真實對象和代理對象的共同接口。
  •        Proxy: 代理角色。代理對象與真實對象實現相同的接口,所以它能夠在任何時刻都能夠代理真實對象。代理角色內部包含有對真實對象的引用,所以她可以操作真實對象,同時也可以附加其他的操作,相當于對真實對象進行封裝。
  •        RealSubject: 真實角色。它代表著真實對象,是我們最終要引用的對象

舉例:
   假若你有一個工廠開始是生產手機的,但是它現在不想自己生產了,它把自己的東西交給了一家代工廠富士康去生產,那么便有了下面的代碼去構建。

統(tǒng)一的抽象接口 IFactory

class IFactory 
{ 
public: 
  IFactory(){} 
  virtual void makeProduct() = 0; 
}; 

你的手機工廠

class PhoneFactory : IFactory 
{ 
public: 
  PhoneFactory(){} 
  void makeProduct() 
  { 
    cout<<"生產手機"<<endl; 
  } 
}; 

專門做代工的代理工廠富士康

class FoxconnProxy : IFactory 
{ 
public: 
  FoxconnProxy(IFactory* factory) 
  { 
    m_real = factory; 
  } 
  void makeProduct() 
  { 
    m_real->makeProduct(); 
  } 
private: 
  IFactory* m_real; 
}; 

客戶端:

IFactory* factory = new PhoneFactory(); 
FoxconnProxy* proxy = new FoxconnProxy(factory); 
proxy->makeProduct(); 


    看了uml圖和上面的代碼你會可能會發(fā)現,先訪問代理類再訪問真正要訪問的對象。似乎這樣有點多此一舉的味道,其實不然。代理類可以在真正的類執(zhí)行之前,進行預處理。 比富士康生產的手機之前可能會堅持元器件是否合格,不合格就不生產等。在比如你有一個系統(tǒng)實現了登陸功能,在用戶登錄時, 真正的登錄類和代理登錄類都實現了Login接口, 不同的是Proxy類的方法中增加了用戶是否合法的判斷, 只有合法時才去調用真正登錄類的login方法. 用戶訪問的其實是Proxy的login方法.這都是代理模式的優(yōu)點。而且采用代理模式的話,并且你可以隨時更改代理。還有一點你會發(fā)現,真正對象與代理他們實現同一個接口。
   這個模式和裝飾者模式有點類似之處,都是包裝,但是請注意他們應用場景不一樣:一個是動態(tài)的給類添加職責,一個是控制對這個對象的訪問。最重要的一點不同是他們的結構不同,你對比下兩個模式的uml圖便知。

相關文章

  • 深入淺析C語言中堆棧和隊列

    深入淺析C語言中堆棧和隊列

    這篇文章主要介紹了深入淺析C語言中堆棧和隊列的相關資料,需要的朋友可以參考下
    2016-06-06
  • C++編程語言中賦值運算符重載函數(operator=)的使用

    C++編程語言中賦值運算符重載函數(operator=)的使用

    本文主要介紹了C++編程語言中賦值運算符重載函數(operator=)介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C++中const的實現機制深入分析

    C++中const的實現機制深入分析

    C語言以及C++語言中的const究竟表示什么?其具體的實現機制又是如何實現的呢?本文將對這兩個問題進行一些分析,需要了解的朋友可以參考下
    2012-12-12
  • MFC控件大小隨窗體大小而改變

    MFC控件大小隨窗體大小而改變

    本文給大家分享的是使用VC++根據對話框大小調整控件大小的方法和示例代碼,有需要的小伙伴可以參考下。
    2015-06-06
  • 使用C語言計算長方體的表面積和體積

    使用C語言計算長方體的表面積和體積

    這篇文章主要給大家介紹了關于如何使用C語言計算長方體的表面積和體積的相關資料,在C語言中,我們可以使用乘法運算符(*)來進行乘法運算,并將結果保存在一個變量中,需要的朋友可以參考下
    2023-10-10
  • 基于C/C++ 常見誤區(qū)詳解

    基于C/C++ 常見誤區(qū)詳解

    本篇文章介紹了在c和c++中一些常見誤區(qū)的詳細概述。需要的朋友參考下
    2013-05-05
  • C語言數據結構深入探索順序表

    C語言數據結構深入探索順序表

    大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內容全部整理到了一起,希望能夠給剛剛進行學習數據結構的人帶來一些幫助,或者是已經學過這塊的朋友們帶來更深的理解,我們現在就開始吧
    2022-05-05
  • 詳解C++之類和對象(1)

    詳解C++之類和對象(1)

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數
    2021-11-11
  • 詳解C語言中函數宏的三種封裝方式

    詳解C語言中函數宏的三種封裝方式

    函數宏,即包含多條語句的宏定義,其通常為某一被頻繁調用的功能的語句封裝,且不想通過函數方式封裝來降低額外的彈棧壓棧開銷。本文就來聊聊函數宏的三種封裝方式吧
    2023-03-03
  • C語言形參和實參傳值和傳址詳解刨析

    C語言形參和實參傳值和傳址詳解刨析

    形參出現在函數定義中,在整個函數體內都可以使用, 離開該函數則不能使用。實參出現在主調函數中,進入被調函數后,實參變量也不能使用,形參和實參的功能是作數據傳送。發(fā)生函數調用時, 主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送
    2021-11-11

最新評論