代理模式定义
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端对象之间起到中介的作用。
代理类和被代理的类具有共同接口。
代理模式的应用场景
1、在不同机器上服务器上的应用
A机器服务要和B服务器的通信,A服务器请求B服务器执行doXXX()方法,两个服务器都要进行开发,然而B服务器还没开发好,A机器服务已经做好,则A机器服务无法测试,此时A机器服务测试可以通过代理模式用代理类模拟一个真正B机器上的服务模块。
2、web服务器
用户输入域名访问web服务,用户在网页点击网页某个地方就会触发去访问web请求资源,web服务要解释请求访问的数据,再返回去给用户。
如果是直接访问web服务器,这个过程费时费力,当大量用户访问web服务器就会造成网络拥堵、服务崩溃等,所以中间搞了个缓冲服务器起到代理作用,就如代理模式的定义一样为其他对象提供一种代理以控制对这个对象的访问
。当用户访问的数据在缓冲服务器上有且是最新的就不会去访问web服务器,会直接从缓冲服务器上返回用户请求的数据。
3、代理服务器
你有张良计,我有过墙梯?法外狂徒张三
代理模式示例图
Subject
—— 抽象主题角色(抽象类),真实主题与代理主题的共同接口(继承同一抽象父类)
RealSubject
—— 真实主题角色(被代理的对象), 即代理角色所代表的真实对象。
简单的代理模式案例
假设现在有一个系统,用户要执行这个系统,但不是随意都可以执行,必须要一定权限才能执行,假设权限就是要提供正确用户名和密码才能执行。
抽象主题:
class AbstractCommon{
public:
virtual void run() = 0;
};
真实主题:
#include "AbstractCommon.h"
#include <iostream>
using namespace std;
class MySystem : public AbstractCommon{
public:
virtual void run();
};
void MySystem::run(void)
{
cout << "My System is running" << endl;
}
代理主题:
#include "AbstractCommon.h"
#include "MySystem.h"
class ProxySystem : public AbstractCommon{
private:
MySystem *mSystem;
string mUserName;
string mPassword;
bool IsUserNameRight(void);
bool IsPasswordRight(void);
public:
virtual void run();
void SetUserName(string username);
void SetPassword(string password);
ProxySystem();
~ProxySystem();
};
ProxySystem::ProxySystem()
{
mSystem = new MySystem;
}
ProxySystem::~ProxySystem()
{
if (mSystem != NULL)
{
delete mSystem;
}
}
void ProxySystem::run() //通过这个函数代理执行真正的系统
{
if (IsUserNameRight() && IsPasswordRight()) //加上用户名和密码验证正确权限控制访问
{
cout << "系统登录成功" << endl;
mSystem->run();
}
else
{
cout << "用户名或密码错误, 请检查" << endl;
}
}
bool ProxySystem::IsUserNameRight(void)
{
if (mUserName == "Ares")
{
return true;
}
return false;
}
bool ProxySystem::IsPasswordRight(void)
{
if (mPassword == "123456")
{
return true;
}
return false;
}
void ProxySystem::SetUserName(string username)
{
mUserName = username;
}
void ProxySystem::SetPassword(string password)
{
mPassword = password;
}
main函数:
#include <iostream>
#include "Proxy.h"
using namespace std;
int main()
{
ProxySystem *proxy = new ProxySystem;
proxy->SetUserName("Ares");
proxy->SetPassword("123456");
proxy->run(); //通过代理来执行
delete proxy;
return 0;
}