C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例
代理模式典型的結(jié)構(gòu)圖為:

實(shí)際上,代理模式的想法非常簡單。
代理模式的實(shí)現(xiàn):
完整代碼示例(code):代理模式的實(shí)現(xiàn)很簡單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用 C++實(shí)現(xiàn),并在 VC 6.0 下測試運(yùn)行)。
代碼片斷 1:Proxy.h
//Proxy.h
#ifndef _PROXY_H_
#define _PROXY_H_
class Subject{
public:
virtual ~Subject();
virtual void Request() = 0;
protected:
Subject();
private:
};
class ConcreteSubject:public Subject{
public:
ConcreteSubject();
~ConcreteSubject();
void Request();
protected:
private:
};
class Proxy{
public:
Proxy();
Proxy(Subject* sub);
~Proxy();
void Request();
protected:
private:
Subject* _sub;
};
#endif //~_PROXY_H_
代碼片斷 2:Proxy.cpp
//Proxy.cpp
#include "Proxy.h"
#include <iostream>
using namespace std;
Subject::Subject(){
}
Subject::~Subject(){
}
ConcreteSubject::ConcreteSubject(){
}
ConcreteSubject::~ConcreteSubject(){
}
void ConcreteSubject::Request(){
cout<<"ConcreteSubject......request
...."<<endl;
}
Proxy::Proxy(){
}
Proxy::Proxy(Subject* sub){
_sub = sub;
}
Proxy::~Proxy(){
delete _sub;
}
void Proxy::Request(){
cout<<"Proxy request...."<<endl;
_sub->Request();
}
代碼片斷 3:main.cpp
//main.cpp
#include "Proxy.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[]){
Subject* sub = new ConcreteSubject();
Proxy* p = new Proxy(sub);
p->Request();
return 0;
}
代碼說明:代理模式的實(shí)現(xiàn)很簡單,這里不做多余解釋??梢钥吹剑纠a運(yùn)行后,p 的 Request 請求實(shí)際上是交給了 sub 來實(shí)際執(zhí)行。
再來看一個(gè)例子:
#include <iostream>
#include <string>
using namespace std;
class Receiver
{
private:
string name;
public:
Receiver(string name):name(name)
{
}
string GetName()
{
return name;
}
};
class Subject
{
public:
virtual void display(){}
};
class Sender:public Subject
{
Receiver *someone;
public:
void SetReceiver(Receiver *someone)
{
this->someone = someone;
}
virtual void display()
{
cout<<"i hate you:" << someone->GetName()<<endl;
}
};
class Proxy:public Subject
{
public:
Subject *realobject;
void SetClient(Subject *client)
{
this->realobject = client;
}
void display()
{
realobject->display();
}
};
int main()
{
Receiver *recv = new Receiver("nobody");
Sender *obj = new Sender;
obj->SetReceiver(recv);
Proxy *proxy = new Proxy;
proxy->SetClient(obj);
proxy->display();
system("pause");
return 0;
}
由此可見,代理模式最大的好處就是實(shí)現(xiàn)了邏輯和實(shí)現(xiàn)的徹底解耦。
相關(guān)文章
C++讀寫(CSV,Yaml,二進(jìn)制)文件的方法詳解
為了處理文件,我們可以利用fstream庫。在這個(gè)庫里面有三種數(shù)據(jù)類型:ofstream,ifstream,fstream。本文將利用這個(gè)庫實(shí)現(xiàn)不同文件的讀寫操作,需要的可以參考一下2022-05-05
C++實(shí)現(xiàn)LeetCode(21.混合插入有序鏈表)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(21.混合插入有序鏈表),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生選課系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟
本文主要介紹了VS2019安裝cbd調(diào)試器的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
stl常用算法(Algorithms)介紹(stl排序算法、非變序型隊(duì)列)
這篇文章主要介紹了stl常用算法(Algorithms)介紹(stl排序算法、非變序型隊(duì)列),需要的朋友可以參考下2014-05-05
Qt學(xué)習(xí)筆記之QPalette調(diào)色板類
這篇文章主要為大家詳細(xì)介紹了Qt學(xué)習(xí)筆記之QPalette調(diào)色板類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

