设计模式:代理模式(C++)【代理服务器案例】
生活随笔
收集整理的這篇文章主要介紹了
设计模式:代理模式(C++)【代理服务器案例】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代理模式介紹
今天繼續學習設計模式,今天我們來學習代理模式。其實這個模式呢在我們的生活早已經運用起來了。筆者看到這個模式就聯想到了代理商。我們客戶買東西一般都是經過代理商的,代理商和真正的生成產品的公司進行對接,因為代理商有錢嘛可以搞壟斷賺差價嘛。其實在軟件設計中的代理模式和我們現實生活中很類似。在設計模式中,我們的代理模式是這樣的,客戶端并不能直接訪問真正的主題對象,只能通過代理對象進行間接的訪問,這樣我們就可通過代理對象來控制對真實主題對象的訪問,可以在訪問前后做一些動作,比如校驗什么之類的呀。下面我們看一下標準的代理模式模型圖。
代理模式標準模型圖
從圖中可以,為啥我們的代理對象能代理真實的主題對象 干事呢?很重要一點,他們都繼承實現共同的接口。這樣在需要訪問真實主題對象是都可以使用代理對象 進行訪問控制。
代理服務器案例
在了解上面代理模式相關知識后,這個代理服務器訪問的案例也就不難理解了。訪問真正的服務器,需要通過代理服務器,代理服務器進行用戶名密碼校驗,通過才允許訪問真實服務器。
代理服務器模型圖
代理服務器代碼
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //抽象類,抽象的主題類 class AbstractServer { public:virtual void Request() = 0; }; //真正主題類,具體提供服務的類 class RealServer:public AbstractServer {virtual void Request(){cout << "服務器啟動..." << endl;}}; //代理服務器,非真正的服務器,訪問真正服務器必須通過代理服務器 class ProxyServer :public AbstractServer { public:ProxyServer(string name, string pwd){this->name = name;this->pwd = pwd;this->server = new RealServer;}// 和 真正主題類實現共同的接口,對外可以提供一致的接口!virtual void Request(){if (!CheckUser()){cout << "用戶名或者密碼錯誤..." << endl;return;}cout << "請求成功..." << endl;PreRequest();this->server->Request();PostRequest();} private://訪問服務器前 進行的動作,可以控制對真實主題類的訪問bool CheckUser(){if ("admin" == this->name && "123456" == this->pwd){return true;}return false;}//真正訪問服務器前 進行的動作,這里進行安全void PreRequest(){cout << "進入代理服務器..." << endl;}//訪問服務器之后 進行的動作void PostRequest(){cout << "服務器訪問完畢..." << endl;}string name;string pwd; private:AbstractServer* server; };//客戶端 通過登錄代理服務器 訪問 真實服務器 int main(int argc, char *argv[]) {AbstractServer *proxy = new ProxyServer("admin", "123456");//登錄代理服務器proxy->Request();//通過代理服務器 訪問真正服務器return EXIT_SUCCESS; }運行結果
總結
以上是生活随笔為你收集整理的设计模式:代理模式(C++)【代理服务器案例】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统实践(四/五)
- 下一篇: 公共情报工具automater的基本使用