亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之代理模式

2020-05-23 14:20:38
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之代理模式,本文講解了什么是代理模式、代理模式的使用場合、代理模式的實現代碼等內容,需要的朋友可以參考下
 
 

前言

青春總是那樣,逝去了才開始回味;大學生活也是在不經意間就溜走了,現在上班的時候,偶爾還會懷念大學時,大家在一起玩游戲的時光。大學喜歡玩游戲,但是可悲的校園網,速度能把人逼瘋了;還好,后來搞了一個游戲代理,總算能勉勉強強的玩了兩年。時至今日,敲起鍵盤寫設計模式的時候,又想起了那些美好的時光。好了,這是一篇技術文章,而不是抒情懷舊的散文;思緒再回到這篇文章上來,游戲代理,是個什么東西,有了它就能讓我們玩游戲的延遲立馬下來了。今天,我并不會去總結游戲代理是如何實現的,重點是通過游戲代理這個例子來總結設計模式中的代理模式。

什么是代理模式?

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對代理模式是這樣說的:為其他對象提供一種代理以控制對這個對象的訪問。結合上面的游戲代理的例子和下面的圖,我們來進行分析一下。以前你是這樣玩游戲:

C++設計模式之代理模式

現在有了游戲代理,你是這樣玩游戲:

C++設計模式之代理模式

代理服務器干了什么?它代替你去和游戲服務器進行交互。它訪問游戲服務器的速度比你使用校園網訪問游戲服務器的速度快很多。所以,你的游戲延遲就下來了。

代理模式分為四類:遠程代理,虛代理,保護代理和智能引用。在下面使用場合會對這四種進行分別介紹。

UML類圖

C++設計模式之代理模式

Proxy

1.保存一個引用使得代理可以訪問實體。若RealSubject和Subject的接口相同,Proxy會引用Subject,就相當于在代理類中保存一個Subject指針,該指針會指向RealSubject;
2.提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體;
3.控制對實體的存取,并可能負責創建和刪除它;
4.其它功能依賴于代理的類型,例如:

遠程代理負責對請求及其參數進行編碼,并向不同地址空間中的實體發送已編碼的請求;
虛代理可以緩存實體的附加信息,以便延遲對它的訪問;
保護代理檢查調用者是否具有實現一個請求所必須的訪問權限。

Subject:定義RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy;

RealSubject:定義Proxy所代理的實體。

使用場合

上面也總結了,代理模式分為遠程代理,虛代理,保護代理和智能引用這四種,而分為這四種,就是對應不同的使用場合的。

1.遠程代理為一個對象在不同的地址空間提供局部代理;
2.虛代理根據需求創建開銷很大的對象;
3.保護代理控制原始對象的訪問;保護代理用于對象應該有不同的訪問權限的時候;
4.智能引用取代了簡單的指針,它在訪問對象時執行一些附加操作,它的典型用途包括:

對指向實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放它;
當第一次引用一個持久對象時,將它裝入內存;
在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能改變它。

代碼實現

最簡單的實現,對上述UML類圖的直接代碼體現:

復制代碼代碼如下:

#include <iostream>
using namespace std;
 
#define SAFE_DELETE(p) if (p) { delete p; p = NULL;}
 
class CSubject
{
public:
    CSubject(){};
    virtual ~CSubject(){}
 
    virtual void Request() = 0;
};
 
class CRealSubject : public CSubject
{
public:
    CRealSubject(){}
    ~CRealSubject(){}
 
    void Request()
    {
        cout<<"CRealSubject Request"<<endl;
    }
};
 
class CProxy : public CSubject
{
public:
    CProxy() : m_pRealSubject(NULL){}
    ~CProxy()
    {
        SAFE_DELETE(m_pRealSubject);
    }
 
    void Request()
    {
        if (NULL == m_pRealSubject)
        {
            m_pRealSubject = new CRealSubject();
        }
        cout<<"CProxy Request"<<endl;
        m_pRealSubject->Request();
    }
 
private:
    CRealSubject *m_pRealSubject;
};
 
int main()
{
    CSubject *pSubject = new CProxy();
    pSubject->Request();
    SAFE_DELETE(pSubject);
}

 

上面的實現,就是對代理模式的最原始體現,現在提供一個有血有肉的實際應用級的體現:

 

復制代碼代碼如下:

#include <iostream>
#include <windows.h>
using namespace std;
 
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
 
class KRefCount
{
public:
    KRefCount():m_nCount(0){}
 
public:
    unsigned AddRef(){ return InterlockedIncrement(&m_nCount); }
    unsigned Release(){ return InterlockedDecrement(&m_nCount); }
    void Reset(){ m_nCount = 0; }
 
private:
    unsigned long m_nCount;
};
 
template <typename T>
class SmartPtr
{
public:
    SmartPtr(void)
        : m_pData(NULL)
    {
        m_pReference = new KRefCount();
        m_pReference->AddRef();
    }
 
    SmartPtr(T* pValue)
        : m_pData(pValue)
    {
        m_pReference = new KRefCount();
        m_pReference->AddRef();
    }
 
    SmartPtr(const SmartPtr<T>& sp)
        : m_pData(sp.m_pData)
        , m_pReference(sp.m_pReference)
    {
        m_pReference->AddRef();
    }
 
    ~SmartPtr(void)
    {
        if (m_pReference && m_pReference->Release() == 0)
        {
            SAFE_DELETE(m_pData);
            SAFE_DELETE(m_pReference);
        }
    }
 
    inline T& operator*()
    {
        return *m_pData;
    }
 
    inline T* operator->()
    {
        return m_pData;
    }
 
    SmartPtr<T>& operator=(const SmartPtr<T>& sp)
    {
        if (this != &sp)
        {
            if (m_pReference && m_pReference->Release() == 0)
            {
                SAFE_DELETE(m_pData);
                SAFE_DELETE(m_pReference);
            }
 
            m_pData = sp.m_pData;
            m_pReference = sp.m_pReference;
            m_pReference->AddRef();
        }
 
        return *this;
    }
 
    SmartPtr<T>& operator=(T* pValue)
    {
        if (m_pReference && m_pReference->Release() == 0)
        {
            SAFE_DELETE(m_pData);
            SAFE_DELETE(m_pReference);
        }
 
        m_pData = pValue;
        m_pReference = new KRefCount;
        m_pReference->AddRef();
        return *this;
    }
 
    T* Get()
    {
        T* ptr = NULL;        
        ptr = m_pData;
 
        return ptr;
    }
 
    void Attach(T* pObject)
    {
        if (m_pReference->Release() == 0)
        {
            SAFE_DELETE(m_pData);
            SAFE_DELETE(m_pReference);
        }
 
        m_pData = pObject;
        m_pReference = new KRefCount;
        m_pReference->AddRef();
    }
 
    T* Detach()
    {
        T* ptr = NULL;
 
        if (m_pData)
        {           
            ptr = m_pData;
            m_pData = NULL;
            m_pReference->Reset();
        }
        return ptr;
    }
 
private:
    KRefCount* m_pReference;
    T* m_pData;
};
 
class CTest
{
public:
    CTest(int b) : a(b) {}
private:
    int a;
};
 
int main()
{
    SmartPtr<CTest> pSmartPtr1(new CTest(10));
    SmartPtr<CTest> pSmartPtr2(new CTest(20));
 
    pSmartPtr1 = pSmartPtr2;
}

 

智能指針使用引用計數實現時,就是最好的使用代理模式的例子。在上面的例子中,SmartPtr就是一個代理類,而T* m_pData才是實際的數據。SmartPtr代理實際的數據,去實現了指針的行為,添加了引用計數,從而實現了智能指針。

總結

我在第一次接觸代理模式的時候,看它的UML類圖,發現它和適配器模式的類適配器很像,再一看,又和裝飾模式非常像;不仔細區分,真的是很容易混亂的。下面就做簡單的區分,說多了也都是“狡辯”了。

1.適配器Adapter為它所適配的對象提供了一個不同的接口。相反,代理提供了與它的實體相同的接口。然而,用于訪問保護的代理可能會拒絕執行實體會執行的操作,因此,它的接口實際上可能只是實體接口的一個子集。

2.盡管Decorator的實現部分與代理相似,但Decorator的目的不一樣。Decorator為對象添加一個或多個功能,而代理則控制對對象的訪問。

我在這里進行區分,你們看了,也就像我在咬文嚼字一樣;這就是結構型設計模式;它們之間都有一些細微的差別。你也可以說,在適配器模式進行接口適配時,添加一些數據轉換就變成了遠程代理;你也可以說裝飾模式雖然功能不一樣,在我看來,大同小異;是的,不管你怎么說,就像1000個讀者心中有1000個哈姆雷特一樣,每個人對設計模式的理解都是不一樣的;最重要的是我們能在實際應用中進行活學活用,如果能做到這個;不管什么設計模式,那只是一個名字,就像對于富人來說,錢只是一個銀行卡上的一個數字一樣。

最后,我堅信分享使我們更加進步,期待大家和我分享你的設計模式心得。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩欧美综合| 国产成人精品网站| 91免费看视频.| 免费av在线一区| 国产女同一区二区| 日韩av在线网| 欧美激情精品久久久| 日韩av在线导航| 欧美日本国产在线| 亚洲成人国产精品| 久久夜色精品国产| 欧美高清视频免费观看| 国产大片精品免费永久看nba| 久久国产精品亚洲| 欧美日韩免费看| 欧美性猛交xxxx免费看漫画| 日韩中文字幕在线视频| 日韩免费不卡av| 欧美成aaa人片在线观看蜜臀| 亚洲成人av中文字幕| 性色av一区二区咪爱| 91精品久久久久久久久久入口| 亚洲国产精品99| 亚洲一区二区在线| 亚洲国产成人精品久久久国产成人一区| 国产精品99久久久久久久久久久久| 夜夜嗨av色综合久久久综合网| 亚洲性av网站| 久久综合久中文字幕青草| 在线播放亚洲激情| 国产这里只有精品| 国产精品视频久久久| 日韩av在线电影网| 欧美一级大片在线观看| 欧美极品在线视频| 精品日韩美女的视频高清| 日韩久久精品成人| 久久久久久亚洲精品不卡| 韩国福利视频一区| 夜夜躁日日躁狠狠久久88av| 中文字幕精品www乱入免费视频| 亚洲国模精品一区| 欧美另类极品videosbestfree| 91精品视频免费| 欧美日韩午夜剧场| 青草青草久热精品视频在线观看| 51色欧美片视频在线观看| 亚洲第一区中文99精品| 97免费在线视频| 久久精品99无色码中文字幕| 欧美日韩不卡合集视频| 国产亚洲a∨片在线观看| 成人乱色短篇合集| 日韩亚洲综合在线| 亚洲国产精品推荐| 91社区国产高清| 亚洲人成电影在线观看天堂色| 久久视频在线视频| 中文字幕在线亚洲| 国产精品视频一| 亚洲一区二区免费| 91禁国产网站| 欧美日韩在线观看视频| 中文字幕亚洲精品| 国产免费久久av| 久久天天躁狠狠躁夜夜av| 日韩中文字幕免费视频| 亚洲综合日韩中文字幕v在线| 亚洲精品网址在线观看| 精品综合久久久久久97| 亚洲精品自产拍| 国产在线观看精品一区二区三区| 欧美在线一级va免费观看| 91深夜福利视频| 一道本无吗dⅴd在线播放一区| 久久国产精品久久久久久久久久| 欧美风情在线观看| 欧美综合第一页| 91精品啪在线观看麻豆免费| 日韩精品极品在线观看播放免费视频| 欧美午夜精品久久久久久人妖| 成人伊人精品色xxxx视频| 欧美高跟鞋交xxxxhd| 国产伦精品一区二区三区精品视频| 亚洲欧洲xxxx| 91av在线视频观看| 奇米4444一区二区三区| 久久免费视频这里只有精品| 国产精品久久久久久中文字| 日韩中文有码在线视频| 亚洲一区二区三| 日韩电影在线观看永久视频免费网站| 亚洲激情视频网| 欧美国产中文字幕| 欧美成人自拍视频| 91午夜理伦私人影院| 欧洲一区二区视频| 九九视频直播综合网| 国产精品亚洲视频在线观看| 国产精品久久久久久久久免费看| 日本国产精品视频| 精品国产自在精品国产浪潮| 国产精品视频内| 久久久久久久999| 欧美电影电视剧在线观看| 欧美成人精品h版在线观看| 欧美成人剧情片在线观看| 性色av香蕉一区二区| 午夜精品一区二区三区在线| 日本欧美一二三区| 国产成人91久久精品| 久久亚洲综合国产精品99麻豆精品福利| 插插插亚洲综合网| 黑人狂躁日本妞一区二区三区| 国产精品a久久久久久| 日韩最新中文字幕电影免费看| 色播久久人人爽人人爽人人片视av| 久久久www成人免费精品张筱雨| 91av国产在线| 日韩av观看网址| 国产精品av在线| 久久全球大尺度高清视频| 日韩欧美亚洲综合| 欧美综合激情网| 欧美色视频日本高清在线观看| xxx成人少妇69| 久久精品视频在线观看| 欧美孕妇毛茸茸xxxx| 日本一欧美一欧美一亚洲视频| 欧美专区福利在线| yellow中文字幕久久| 久久久人成影片一区二区三区观看| 日韩精品极品视频免费观看| 97碰在线观看| 日韩高清电影免费观看完整| 欧美成人性色生活仑片| 在线观看日韩www视频免费| 色婷婷av一区二区三区久久| 夜夜嗨av一区二区三区免费区| 久久精品视频在线播放| 欧洲美女免费图片一区| 国产网站欧美日韩免费精品在线观看| 国产日韩在线看片| 国产精品久久久久久久久久免费| 国产午夜精品理论片a级探花| 精品视频久久久| 中文字幕精品一区二区精品| 亚洲毛片在线免费观看| 97久久精品国产| 日本成人精品在线| 精品欧美国产一区二区三区| 亚洲欧美三级伦理| 成人午夜激情网| 国产成人精品久久| 久久久久久久久久av| 国产精品视频久久| 国产精品午夜视频| 国产成人av在线播放| 国产精品免费在线免费| 国内精品400部情侣激情| 成人性教育视频在线观看| 91在线观看免费高清| 亚洲成人黄色网| 日韩av在线电影网|