代理模式
概念
Proxy 模式又叫做代理模式,是結構型的設計模式之一,它可以為其他對象提供一 種代理(Proxy)以控制對這個對象的訪問。
所謂代理,是指具有與代理元(被代理的對象)具有相同的接口的類,客戶端必須 通過代理與被代理的目標類交互,而代理一般在交互的過程中(交互前后),進行某些 特別的處理。
類圖與各個角色
- subject(抽象主題角色): 真實主題與代理主題的共同接口。
- RealSubject(真實主題角色) : 定義了代理角色所代表的真實對象。
- Proxy(代理主題角色): 含有對真實主題角色的引用,代理角色通常在將客戶端調用傳遞給真是主題對象之前或 者之后執行某些操作,而不是單純返回真實的對象。
適合于: 為其他對象提供一種代理以控制對這個對象的訪問。
示例1
#include<iostream>
#include<string>
using namespace std;//提供一種代理來控制對其他對象的訪問
class AbstractCommonInterface{
public://用來啟動系統virtual void run() = 0;
};//系統有權限驗證,需要提供用戶名和密碼
//系統類
class MySystem{
public:virtual void run() {cout << "系統啟動" << endl;}
};//代理類
class MySystemProxy :public AbstractCommonInterface{
public:MySystemProxy(string username, string password){this->mUsername = username;this->mPassword = password;pSystem = new MySystem;}//判斷用戶名和密碼是否為正確bool checkUsernameAndPassword(){if (mUsername == "admin" && mPassword == "admin"){return true;}return false;}virtual void run(){if (checkUsernameAndPassword()){cout << "啟動成功" << endl;this->pSystem->run();}else{cout << "用戶名或密碼錯誤,無法啟動系統" << endl;}}~MySystemProxy(){if (pSystem != NULL){delete pSystem;}}private:MySystem * pSystem;string mUsername; //用戶名string mPassword; //密碼
};void test01(){MySystemProxy * proxy = new MySystemProxy("admin", "admin");proxy->run();
}int main(void){test01();system("pause");return 0;
}
## 案例
實現在淘寶網上的網上書店賣書
#include<iostream>
using namespace std;//
class Subject
{
public:virtual void SaleBook() = 0;
};class RealSubject :public Subject
{
public:virtual void SaleBook(){cout << "實體店買書.." << endl;}
};代理淘寶
//class ProxyTaoBao :public Subject
//{
//public:;
// virtual void Book()
// {
// //
// Double11();
// RealSubject rs;
// rs.SaleBook();
// Double11();
// }
// void Double11(){
// cout << "Double11 打折 半價" << endl;
// }
//};//代理淘寶
class ProxyTaoBao2 :public Subject
{
public: ProxyTaoBao2(){this->m_s = new RealSubject;}~ProxyTaoBao2(){delete m_s;}virtual void SaleBook() { Double11(); m_s->SaleBook(); } void Double11() { cout << "Double11 打折 半價" << endl; } private: RealSubject* m_s;
};int main(){ProxyTaoBao2 *ptb = new ProxyTaoBao2;ptb->SaleBook();delete ptb;system("pause");return 0;
}