c++ - 更多类的模板化律师-客户成语
问题描述
我试图将 Attorney-Client Idiom(称为 PassKey Idiom)应用到两个课程中。
我解释 :
我有一个名为的类Secret
,它包含私有成员name
并age
作为私有成员。我创建了一个类Attorney
,它为类中的每个成员定义了 2 个吸气剂Secret
。
我想创建 2 个类:
showAge
只能访问 1 个吸气剂showAgeAndName
它可以访问两个吸气剂。
到目前为止一切正常,但查看代码,它的维护性不好:如果我向我添加新成员Secret
并想要对新 getter 的特定访问,我必须添加另一个类并以大量复制粘贴结束。
那么有没有更好的选择,例如:使用工厂设计模式/增强模板类...
下面是我的代码:
#include <string>
#include <iostream>
using namespace std;
class Secret;
class showAge;
class showAgeAndName;
template<typename T>
class Attorney
{
private:
friend T;
Attorney(const Attorney&) {}
Attorney() {}
};
class Secret
{
public:
std::string getAge(Attorney<showAge>) noexcept { return "Age is " + to_string((long long)age); }
std::string getName(Attorney<showAgeAndName>) noexcept { return "Name is " + name; }
private:
int age{36};
std::string name{"Mike"};
};
class showAge
{
public:
showAge() noexcept {};
void showInfos(Secret& src)
{
std::cout << src.getAge(Attorney<showAge>()) << std::endl;
}
};
class showAgeAndName
{
public:
showAgeAndName() noexcept {};
void showInfos(Secret& src)
{
std::cout << src.getName(Attorney<showAgeAndName>()) << std::endl;
}
};
int main() {
Secret s;
showAge prA;
showAgeAndName prAn;
prA.showInfos(s);
prAn.showInfos(s);
}
谢谢
解决方案
在我看来,这种模式比它的价值更麻烦。
相反,也许您会考虑为每个访问角色定义接口,然后通过对适当接口类型的引用来传递对象。这可能更具可读性和直观性,尽管它仍然需要您为每个角色定义和维护接口。
应该选择接口和它们公开的成员函数以适应访问角色。您不一定需要为每个功能提供单独的接口。如果您认为这样做,我会将其视为代码异味,并将其作为重新评估设计的提示。在使用 Attorney-Client / PassKey 模式时也是如此。
Attorney-Client / PassKey 模式的唯一优势是它不需要成员函数是virtual
. 但很可能虚函数的性能成本对您的应用程序并不重要。
一个缺点是 Attorney-Client / PassKey 模式鼓励您根据特定用户(如访问Secret
. 这会产生耦合。最好从通用角色的角度来考虑,可以酌情分配。
推荐阅读
- firebase - Firebase-Dart:上传图像时的明显竞争条件
- html - R - 从mhtml文件中提取数据到excel
- python - 比较两个列表之间的元素并按顺序打印
- css - 调整 2:1 图像的大小以放入 1:1 div
- fabricjs - 文件输入结构 js 添加图像
- mongodb - 将 Flask pod 与 kubernetes 中的 mongodb pod 连接起来。
- python - 检查 for 循环中的多个输入
- php - 如何在php中创建一个表单之外的变量?
- javascript - 视频标签 javascript 源
- angular - 使用 @ngx-translate/core 和 @ngx-translate/http-loader 下载多个 en.json 文件