代理模式
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
代理模式实例之论坛权限控制代理
由类图可知,代理类Proxy关联了真实对象类,并由代理类控制访问的权限。
下面是c++版本的实现
抽象主题角色AbstractPermission
//抽象主题角色AbstractPermission
class AbstractPermission{
public:
virtual void modifyUserInfo() = 0;
virtual void viewNote() = 0;
virtual void publishNote() = 0;
virtual void modifyNote() = 0;
virtual void setLevel(int level) = 0;
};
真实主题角色RealPermission
//真实主题角色RealPermission
class RealPermission : public AbstractPermission{
public:
void modifyUserInfo(){
cout << "修改用户信息!" << endl;
}
void viewNote(){
cout << "查看帖子!" << endl;
}
void publishNote(){
cout << "发布新帖!" << endl;
}
void modifyNote(){
cout << "修改帖子!" << endl;
}
void setLevel(int level){
}
};
代理主题角色PermissionProxy
//代理主题角色PermissionProxy
class PermissionProxy : public AbstractPermission{
public:
PermissionProxy(){
permission = make_shared<RealPermission>();
level = 0;
}
void modifyUserInfo(){
if(level == 0){
cout << "对不起,你没有权限!" << endl;
}else if(level == 1){
permission->modifyUserInfo();
}
}
void viewNote(){
cout << "查看帖子!" << endl;
}
void publishNote(){
if(level == 0){
cout << "对不起,你没有权限!" << endl;
}else if(level == 1){
permission->publishNote();
}
}
void modifyNote(){
if(level == 0){
cout << "对不起,你没有权限!" << endl;
}else if(level == 1){
permission->modifyNote();
}
}
void setLevel(int level){
this->level = level;
}
private:
shared_ptr<RealPermission> permission;
int level;
};
客户端测试
//客户端测试
int main(void){
shared_ptr<AbstractPermission> permission = make_shared<PermissionProxy>();
//普通权限代理
permission->modifyUserInfo();
permission->viewNote();
permission->publishNote();
permission->modifyNote();
cout << "----" << endl;
//提升代理权限
permission->setLevel(1);
permission->modifyUserInfo();
permission->viewNote();
permission->publishNote();
permission->modifyNote();
}
输出结果