【发布时间】:2015-08-04 20:38:07
【问题描述】:
关于这个话题有很多信息。这更像是一个设计问题,但我会举例说明。
假设我真的想传递一个配置文件类,它规定了用户的策略。
struct ApplicationAllowedPolicy
{
public:
bool hasAccess() { return true; }
}
struct ApplicationProhibitedPolicy
{
public:
bool hasAccess() { return false; }
}
template<typename ApplicationPolicy>
class Profile : private ApplicationPolicy
{
bool hasAccess() { return ApplicationPolicy::access(); }
}
int main()
{
Profile<ApplicationAllowedPolicy> allowed;
Profile<ApplicationProhibitedPolicy> prohibited;
// do something with allowed & prohibited
}
以上内容都很好,但我们假设有很多政策需要阅读。5 似乎是一个现实世界的数字,尽管可能更多。然后,假设此配置文件将应用于数百个实例,5 个策略差异很大。要启动,策略行为只会在运行时知道(从文件、数据库等读取)。这很快就会变得不可扩展,除非我完全错过了一些东西。
我想过做一个非类型模板类作为策略。
template<int N>
struct ApplicationPolicy
{
int policy = N;
};
Profile<ApplicationPolicy<1>> allowed;
Profile<ApplicationPolicy<0>> prohibited;
我认为这确实适用于我的情况,但我想知道这是否缺少基于策略的设计要点。我无法看到这一点的优点只是让 Profile 成为一个正常的结构,并根据需要将它的数据成员设置为 true/false。
想法?
【问题讨论】:
-
这就是您的保单的全部内容吗?它是否包含更多信息/特定行为?就像现在一样,您可以在单个布尔值上模板化您的
Profile类并完成它。另外,我没有得到关于在运行时知道策略行为的部分......模板在编译时被实例化。 -
对不起,如果我不清楚。是的,还有更多,但这是一个简单的例子。想象一些布尔策略,加上一些可能返回可见对象向量的策略。等等。 至于运行时,那是不好的行话。从我看到的许多示例中,使用策略的最终类似乎相当静态 - 在一个主要的想法中创建。我需要一些更有活力的东西。出门在外,但如果需要,稍后会编辑。
标签: c++ templates policy-based-design