代理模式
概念
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;
}