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

首頁(yè) > 編程 > C++ > 正文

C++設(shè)計(jì)模式之代理模式

2020-05-23 14:20:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了C++設(shè)計(jì)模式之代理模式,本文講解了什么是代理模式、代理模式的使用場(chǎng)合、代理模式的實(shí)現(xiàn)代碼等內(nèi)容,需要的朋友可以參考下
 
 

前言

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

什么是代理模式?

在GOF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中對(duì)代理模式是這樣說(shuō)的:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。結(jié)合上面的游戲代理的例子和下面的圖,我們來(lái)進(jìn)行分析一下。以前你是這樣玩游戲:

C++設(shè)計(jì)模式之代理模式

現(xiàn)在有了游戲代理,你是這樣玩游戲:

C++設(shè)計(jì)模式之代理模式

代理服務(wù)器干了什么?它代替你去和游戲服務(wù)器進(jìn)行交互。它訪問(wèn)游戲服務(wù)器的速度比你使用校園網(wǎng)訪問(wèn)游戲服務(wù)器的速度快很多。所以,你的游戲延遲就下來(lái)了。

代理模式分為四類:遠(yuǎn)程代理,虛代理,保護(hù)代理和智能引用。在下面使用場(chǎng)合會(huì)對(duì)這四種進(jìn)行分別介紹。

UML類圖

C++設(shè)計(jì)模式之代理模式

Proxy

1.保存一個(gè)引用使得代理可以訪問(wèn)實(shí)體。若RealSubject和Subject的接口相同,Proxy會(huì)引用Subject,就相當(dāng)于在代理類中保存一個(gè)Subject指針,該指針會(huì)指向RealSubject;
2.提供一個(gè)與Subject的接口相同的接口,這樣代理就可以用來(lái)替代實(shí)體;
3.控制對(duì)實(shí)體的存取,并可能負(fù)責(zé)創(chuàng)建和刪除它;
4.其它功能依賴于代理的類型,例如:

遠(yuǎn)程代理負(fù)責(zé)對(duì)請(qǐng)求及其參數(shù)進(jìn)行編碼,并向不同地址空間中的實(shí)體發(fā)送已編碼的請(qǐng)求;
虛代理可以緩存實(shí)體的附加信息,以便延遲對(duì)它的訪問(wèn);
保護(hù)代理檢查調(diào)用者是否具有實(shí)現(xiàn)一個(gè)請(qǐng)求所必須的訪問(wèn)權(quán)限。

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

RealSubject:定義Proxy所代理的實(shí)體。

使用場(chǎng)合

上面也總結(jié)了,代理模式分為遠(yuǎn)程代理,虛代理,保護(hù)代理和智能引用這四種,而分為這四種,就是對(duì)應(yīng)不同的使用場(chǎng)合的。

1.遠(yuǎn)程代理為一個(gè)對(duì)象在不同的地址空間提供局部代理;
2.虛代理根據(jù)需求創(chuàng)建開銷很大的對(duì)象;
3.保護(hù)代理控制原始對(duì)象的訪問(wèn);保護(hù)代理用于對(duì)象應(yīng)該有不同的訪問(wèn)權(quán)限的時(shí)候;
4.智能引用取代了簡(jiǎn)單的指針,它在訪問(wèn)對(duì)象時(shí)執(zhí)行一些附加操作,它的典型用途包括:

對(duì)指向?qū)嶋H對(duì)象的引用計(jì)數(shù),這樣當(dāng)該對(duì)象沒(méi)有引用時(shí),可以自動(dòng)釋放它;
當(dāng)?shù)谝淮我靡粋€(gè)持久對(duì)象時(shí),將它裝入內(nèi)存;
在訪問(wèn)一個(gè)實(shí)際對(duì)象前,檢查是否已經(jīng)鎖定了它,以確保其他對(duì)象不能改變它。

代碼實(shí)現(xiàn)

最簡(jiǎn)單的實(shí)現(xiàn),對(duì)上述UML類圖的直接代碼體現(xiàn):

復(fù)制代碼代碼如下:

#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);
}

 

上面的實(shí)現(xiàn),就是對(duì)代理模式的最原始體現(xiàn),現(xiàn)在提供一個(gè)有血有肉的實(shí)際應(yīng)用級(jí)的體現(xiàn):

 

復(fù)制代碼代碼如下:

#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;
}

 

智能指針使用引用計(jì)數(shù)實(shí)現(xiàn)時(shí),就是最好的使用代理模式的例子。在上面的例子中,SmartPtr就是一個(gè)代理類,而T* m_pData才是實(shí)際的數(shù)據(jù)。SmartPtr代理實(shí)際的數(shù)據(jù),去實(shí)現(xiàn)了指針的行為,添加了引用計(jì)數(shù),從而實(shí)現(xiàn)了智能指針。

總結(jié)

我在第一次接觸代理模式的時(shí)候,看它的UML類圖,發(fā)現(xiàn)它和適配器模式的類適配器很像,再一看,又和裝飾模式非常像;不仔細(xì)區(qū)分,真的是很容易混亂的。下面就做簡(jiǎn)單的區(qū)分,說(shuō)多了也都是“狡辯”了。

1.適配器Adapter為它所適配的對(duì)象提供了一個(gè)不同的接口。相反,代理提供了與它的實(shí)體相同的接口。然而,用于訪問(wèn)保護(hù)的代理可能會(huì)拒絕執(zhí)行實(shí)體會(huì)執(zhí)行的操作,因此,它的接口實(shí)際上可能只是實(shí)體接口的一個(gè)子集。

2.盡管Decorator的實(shí)現(xiàn)部分與代理相似,但Decorator的目的不一樣。Decorator為對(duì)象添加一個(gè)或多個(gè)功能,而代理則控制對(duì)對(duì)象的訪問(wèn)。

我在這里進(jìn)行區(qū)分,你們看了,也就像我在咬文嚼字一樣;這就是結(jié)構(gòu)型設(shè)計(jì)模式;它們之間都有一些細(xì)微的差別。你也可以說(shuō),在適配器模式進(jìn)行接口適配時(shí),添加一些數(shù)據(jù)轉(zhuǎn)換就變成了遠(yuǎn)程代理;你也可以說(shuō)裝飾模式雖然功能不一樣,在我看來(lái),大同小異;是的,不管你怎么說(shuō),就像1000個(gè)讀者心中有1000個(gè)哈姆雷特一樣,每個(gè)人對(duì)設(shè)計(jì)模式的理解都是不一樣的;最重要的是我們能在實(shí)際應(yīng)用中進(jìn)行活學(xué)活用,如果能做到這個(gè);不管什么設(shè)計(jì)模式,那只是一個(gè)名字,就像對(duì)于富人來(lái)說(shuō),錢只是一個(gè)銀行卡上的一個(gè)數(shù)字一樣。

最后,我堅(jiān)信分享使我們更加進(jìn)步,期待大家和我分享你的設(shè)計(jì)模式心得。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
男女日批视频在线观看| 夜夜骑夜夜操| 色综合影院在线| 欧美性xxxxx极品视频| 青青草原在线免费观看视频| 美女激情福利视频在线观看| 98色花堂精品视频在线观看| 成人性做爰aaa片免费看不忠| 精品在线观看入口| 久久久爽爽爽美女图片| a天堂中文字幕| a天堂视频在线| 91丨九色丨蝌蚪| 日韩av片在线免费观看| eeuss影院网站免费观看| 亚洲AV第二区国产精品| 成人黄色片视频| 99久久精品免费看国产免费软件| 麻豆传传媒久久久爱| 国产一区二区三区成人| 久久精品国产www456c0m| av电影在线观看| www黄色日本| 大桥未久在线视频| 人妻换人妻a片爽麻豆| 91丝袜脚交足在线播放| 在线视频日韩| 国产在线xxxx| 四虎精品永久免费| 日本高清免费不卡视频| 国产精品污www在线观看| 色资源网在线观看| 亚洲xxx拳头交| 国产欧美久久久久| 黄色av免费播放| 黄色av网站免费在线观看| 2019国产精品自在线拍国产不卡| 日韩高清免费在线| 日本在线视频免费| 免费免费啪视频在线观看| 一区二区三区久久| 成人在线播放网址| 黄色小视频免费| 成人免费毛片日本片视频| 国语对白中文字幕| 国产91成人video| 九九热这里只有精品6| 国产拍欧美日韩视频二区| 日韩av片在线播放| www.国产一区| 黄色91在线观看| 精品国产一区一区二区三亚瑟| 久久久久久艹| 欧美精品1区2区3区| 欧美精品偷拍| 爱情岛论坛vip永久入口| 国产欧美综合一区二区三区| 男男视频亚洲欧美| 亚洲欧洲成人精品av97| 99视频一区| 国产不卡一区二区三区在线观看| 一区二区三区免费播放| 欧美成人亚洲成人日韩成人| 国产成人亚洲精品青草天美| 一区二区不卡视频在线观看| 久久精品成人av| 国产精品天干天干在线综合| 国产香蕉在线| 欧美日韩精品一区二区三区在线观看| 97在线资源| 免费看成人片| 91网页版在线| 日韩avvvv在线播放| 国产无遮挡又黄又爽免费软件| 亚洲最大激情网| 亚洲毛片在线免费观看| 国产亚洲综合久久| 白白色在线发布| 欧美第一精品| 91在线品视觉盛宴免费| 日本久久免费| 日韩av色综合| 男男一级淫片免费播放| 欧美日韩日日摸| 中文字幕视频网站| 一区在线视频观看| 欧美韩国日本在线观看| bbw丰满大肥奶肥婆| 亚洲国产精品久久久男人的天堂| 国产高清在线免费| 在线免费观看一区二区三区| 在线免费看黄色片| 久久草.com| 69xxx在线| 亚洲欧美视频一区二区三区| 一本色道亚洲精品aⅴ| 国产精品美女久久久免费| 久久亚洲免费视频| 久久r热视频| 青青青手机在线视频观看| 久久精品99久久久| 呦呦视频在线观看| 色婷婷av一区二区三区在线观看| 极品裸体白嫩激情啪啪国产精品| 色综合亚洲精品激情狠狠| 天堂资源最新在线| 91在线视频播放地址| 精品久久97| 久久久久国产一区二区三区四区| 9191国产视频| 成人性生交大片免费看中文网站| 800av免费在线观看| 今天的高清视频免费播放成人| 欧美成人精品一区二区免费看片| 91日韩一区二区三区| 亚洲视频一区二区免费在线观看| 波多野结衣xxxx| 亚洲国产精品久久久天堂| 久草在线在线| 亚洲福利天堂| 一根才成人网| 成人一区二区三区在线观看| 免费成人小视频| www精品美女久久久tv| 亚洲图片小说网| 久久一区欧美| 国产精品国产三级国产a| 国模gogo一区二区大胆私拍| 先锋影音在线播放av| 成人av国产| 老司机深夜福利在线观看| 7777久久香蕉成人影院| 91美女片黄在线观看游戏| 亚洲图片欧美视频| 91久久极品少妇xxxxⅹ软件| av色综合久久天堂av综合| 国产这里有精品| 一卡二卡三卡日韩欧美| 成人黄色免费看| 成年人性生活视频| 日本视频中文字幕| yellow在线观看网址| 中文字幕少妇| 欧美日韩一级黄色片| 国产麻豆剧传媒精品国产| 精品在线观看一区| 国产丰满美女做爰| 国产99视频在线观看| 亚洲视屏在线观看| 日韩精品黄色网| 好吊妞这里只有精品| 天天躁夜夜躁狠狠是什么心态| 久久国产乱子伦精品| www.色就是色.com| 在线观看成人一级片| 欧美在线观看你懂的| 成人h动漫精品| 一道本无吗一区| 久久一区二区三区超碰国产精品| 亚洲欧美激情另类校园| 亚洲一区二区少妇| 欧美亚洲免费电影| 亚洲精品国产精品国自产网站| 热re66久久精品国产99热| 亚洲人人夜夜澡人人爽| 免费在线观看的毛片| 91tv国产成人福利| 欧美一级淫片播放口| 日本一区二区免费在线观看视频| 久久精品亚洲欧美日韩精品中文字幕| 狠狠久久综合婷婷不卡| 来吧亚洲综合网| 亚洲日本伦理| jizz国产精品| 宅男视频免费在线观看视频| 老熟妇仑乱视频一区二区| 亚洲午夜一级| 成av人电影在线观看| 成人国产精品日本在线| 精品国产一区二区三区2021| 又大又长粗又爽又黄少妇视频| 国产av一区二区三区传媒| 亚洲欧美日韩精品永久在线| 懂色av一区二区三区在线播放| 蜜桃一级网站.| 亚洲精品毛片一区二区三区| 性欧美黑人xxxx| 加勒比免费视频| 亚洲综合一区在线| 亲爱的老师6电影韩剧| 国产成人麻豆免费观看| 久久91亚洲人成电影网站| 中文在线字幕av| 污污视频在线观看网站| 羞羞的网站在线观看| 精品一区在线观看视频| 亚洲一区二区日本| 亚洲成人人体| 亚洲成人av在线电影| 欧美美女在线直播| 九一国产在线观看| 国产三级精品三级在线观看| 在线观看日韩av先锋影音电影院| 日韩精品一页| 国产亚洲在线播放| 区一区二在线观看| 国产成人精品视频ⅴa片软件竹菊| jizz日本18| 色综合天天综合网中文字幕| 在线观看你懂| 依依成人综合视频| 精品在线欧美视频| 萌白酱国产一区二区| 中文av一区特黄| 自拍偷拍亚洲| 青青a在线精品免费观看| 日韩精品一区二区三区久久| 国产精品久久久久久久久久久久久久久久| 国产电影一区二区在线观看| 一区免费观看| 欧美成人久久久| 日本久久综合网| 激情另类综合| 亚洲最新无码中文字幕久久| 999在线免费观看视频| 亚洲AV第二区国产精品| 成人av毛片在线观看| 亚洲美女在线视频| 潘金莲一级淫片aaaaaa播放| 国产日本精品视频| 美女被爆操网站| 4hu最新网址| 精品无码av一区二区三区不卡| 可以免费看av的网址| 久久久免费看片| 97国产在线播放| 欧美一区二区性| 中文在线资源观看视频网站免费不卡| 99精品桃花视频在线观看| 五月婷婷伊人网| 91av视频在线| 久久久精品免费看| youjizz.com在线观看| 特黄国产免费播放| 91麻豆精品在线观看| 福利视频一区二区三区| 一区二区三区偷拍| 九九精品视频在线看| 宅男av一区二区三区| 欧美丰满老妇熟乱xxxxyyy| 性xxxx视频| 亚洲日本一区二区三区在线观看| 国产在线激情视频| 99久久香蕉| 日韩影视一区二区三区| 国产51人人成人人人人爽色哟哟| 国产人妖ts一区二区| 亚洲作爱视频| www.色婷婷| 亚洲国产午夜伦理片大全在线观看网站| 日韩不卡一区二区三区| 手机看片日韩国产| 黄色羞羞视频在线观看| 久青青在线观看视频国产| 国产一级免费黄色片| 韩国精品在线观看| 国产精品9区| 国产 porn| 久久国产精品区| 一女被多男玩喷潮视频| 欧美xxxx黑人xyx性爽| 97天天综合网| 美女一区网站| 青草青在线视频| 午夜在线不卡| 国产亚洲精品美女| 欧美在线一二三| 日本黄色小说视频| 日韩欧美国产wwwww| 久操av在线| 日韩av片电影专区| 日本成址在线观看| 亚洲激情 欧美| 神马影院我不卡| 亚洲精品一区二区三区中文字幕| 香蕉视频在线看| 成人精品999| 国产大片中文字幕在线观看| 久热中文字幕精品视频在线| 搞黄网站在线观看| 国产无遮挡一区二区三区毛片日本| 日本一级在线观看| 欧美最猛黑人xxxxwww| 日本簧片在线观看| 91成人国产精品| 麻豆久久久久| 精品久久久久成人码免费动漫| 久久久久久毛片免费看| 黄色av中文字幕| 日本福利片高清在线观看| 国产精品欧美日韩久久| 日韩成人在线电影网| 91在线视频精品| 四虎精品永久免费| 欧美日韩国产免费观看| 蜜桃av中文字幕| 成人av资源网| 少妇性l交大片7724com| 粉嫩精品导航导航| 男人晚上看的视频| 99久久婷婷| 国产精品久久亚洲| 欧美精品成人| 日本毛片在线观看| 69堂精品视频在线播放| 色综合av在线| 亚洲啪啪av| 国产一区二区三区四区五区3d| 秋霞毛片大全| 日本黄在线观看| 日韩精品一区二区三区三区免费| 九九热最新视频//这里只有精品| 国产精品毛片一区视频播| 精品国产a一区二区三区v免费| 午夜精品蜜臀一区二区三区免费| 免费毛片一区二区三区久久久| 99精品视频免费在线观看| 亚洲精品无人区|