一,代理模式
原理:
为其他对象提供一种代理,以控制对这个对象的访问。
代理模式示意图:
应用实例:
我们要做一个数据库管理系统,做一个根据不同的权限进行数据删改查的系统,下面是一个很low的设计。
class DBManager{
private:
string userId;
public:
DBManager(const string &str):userId(str){}
void add(){
if(userId == "chongchong"){
//执行往数据库里添加数据的操作
}
}
};
程序分析:
上面这个是很low的设计,如果验证用户权限的规则发生改变,那就必须重新修改所有的数据库操作逻辑。权限判断
的功能和数据库操作的功能被放在一个类中,权限的规则变化和数据库操作的规则变化,都有可能引起DBManager
修改当前代码。我们可以使用Proxy模式,来实现功能的分离,下面这个是比较高大上的设计。
#include <iostream>
using namespace std;
class Protocal{
public:
virtual void add(){}
};
class DBManager : public Protocal{
private:
string userId;
public:
DBManager(const string &str):userId(str){}
void add(){
//添加一条记录到数据库中
}
};
class Proxy : public Protocal{
private:
DBManager &manager;
public:
Proxy(DBManager &db):manager(db){}
void add(){
//先对用户的权限进行验证,然后再执行往数据库添加数据的操作
manager.add();
}
};
int main() {
DBManager manager("123456");
Proxy delegate(manager);
delegate.add();
return 0;
}
程序分析:
上面的数据库系统使用代理模式,实现权限判断与数据库操作功能的分离。DBManager类实现数据库操作,代理
Proxy类里面进行权限判断。