前言
连环的使用if/else或者switch语句来进行条件判断,在代码量不多的情况或者后续不需要怎么拓展和修改,维护起来还不算麻烦。但是,遇到一些比较复杂的项目,这种做法总会让人吐槽,显得十分的不优雅。
例如这样的情况:
class JudgeRole
{
public:
std::string Judge( std::string roleName )
{
std::string result = "";
if( roleName == "A" )
{
result = roleName + "has A permission";
}
else if( roleName == "B" )
{
result = roleName + "has B permission";
}
else if( roleName == "C" )
{
result = roleName + "has C permission";
}
return result;
}
};
这时,如果要再增加n个角色(D,E,F…),那么只需要在后面重复增加n个else if个代码块,这样做显然十分的nt。下面介绍两种设计模式来解决:
工厂模式
首先,定义一个角色的基类接口:
// 基类
class RoleOperation
{
public:
virtual std::string Op() = 0; // 纯虚函数
virtual ~RoleOperation() {
} // 虚析构函数
};
接着,针对不同的角色类,继承基类,并实现Op函数:
// 角色A
class A: public RoleOperation {
public:
RootAdminRole(const std::string &roleName)
: m_RoleName(roleN