代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问
。在某些情况下,一个对象不适合 或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式有以下三种角色:
Subject(抽象主题角色)
:真实主题与代理主题的共同接口。
RealSubject(真实主题角色)
:定义了代理角色所代表的真实对象。
Proxy(代理主题角色)
:含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。
代码演示:
//抽象主题角色
//抽象的公共接口
class AbstractCommonInterface
{
public:
virtual void run() = 0;
virtual ~AbstractCommonInterface() {};
};
//真实主题角色
//真实的系统
class MySystem :public AbstractCommonInterface
{
public:
void run() override
{
cout << "系统启动....." << endl;
}
};
在这里插入代码片
//代理主题角色
//必须要有权限验证,不是所有人都能来启动我的系统,提供用户名和密码
class MySystemProxy :public AbstractCommonInterface
{
public:
MySystemProxy(string mUserName, string mPassword) : mySystem(new MySystem){
this->mUserName = mUserName;
this->mPassword = mPassword;
};
~MySystemProxy(){
if (mySystem != nullptr) {
delete mySystem;
}
};
bool checkUserNameAndPassword() {
if (mUserName == "admin" && mPassword == "123")
{
return true;
}
else {
return false;
}
}
void run() override
{
if (checkUserNameAndPassword())
{
this->mySystem->run();//调真实的服务系统
}else {
cout << "accout or password is error!" << endl;
}
}
private:
MySystem* mySystem;//真实系统的指针
string mUserName; //账号
string mPassword; //密码
};
测试调用:
int main(int argc, char* argv[])
{
AbstractCommonInterface* mySystemProxy = new MySystemProxy("admin","123");
mySystemProxy->run();
delete mySystemProxy;
return 0;
}
输出结果:
代理模式类的UML图如下: