结构型模式----代理模式
代理模式为其它对象提供了一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
实现和结构
代理模式通过定义一个抽象主题的代理来包含真是主题,从而实现真实主题的访问
模式组成
-
抽象角色:通过接口或抽象类声明真实角色实现的业务方法
-
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
-
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
模式特性
优点
- 代理对象可以在客户端和对象之间起到中介的作用,同时也可以保护目标对象
- 降低系统的耦合度
- 高扩展性
缺点
- 减缓目标对象和客户端之间的处理速度
- 增加了系统的复杂度
代理模式UML类图
代理模式的应用场景
- 虚拟代理:延迟初始化,为了提供系统的性能,延迟对目标的加载
- 安全代理:用于控制不同种类客户对真实对象的访问权限
- 智能引用:没有客户端使用某个重量级对象时销毁该对象
- 日志记录代理:用于保存对于服务对象的访问记录
- 远程代理:用于服务对象位于远程服务器的情形
代理模式实例
#include<iostream>
using namespace std;
//抽象角色
class AbstractInterface{
public:
virtual void run() = 0;
};
//真实角色
class MySystem : public AbstractInterface
{
public:
virtual void run()
{
cout << "系统启动成功!!!" << endl;
}
};
//代理角色
class SystemProxy : public AbstractInterface
{
public:
SystemProxy(string username, string password)
{
this->mUsername = username;
this->mPassword = password;
pSystem = new MySystem;
}
~SystemProxy()
{
if (pSystem != NULL)
delete pSystem;
}
bool check()
{
if (mUsername == "root" && mPassword == "123456")
return true;
else
return false;
}
virtual void run()
{
if (check())
{
cout << "验证成功..." << endl;
this->pSystem->run();
}
else
cout << "验证失败!!!" << endl;
}
private:
string mUsername;
string mPassword;
MySystem* pSystem;
};
int main()
{
SystemProxy* proxy = new SystemProxy("root","123456");
proxy->run();
system("pause");
return 0;
}