使用基于策略的C++设计
我目前的类设计是这样的,我复制了类层次结构和函数调用:使用基于策略的C++设计,c++,policy-based-design,C++,Policy Based Design,我目前的类设计是这样的,我复制了类层次结构和函数调用: Helper* HelperFactory::create(const Advice& advice, const Handler& ah) { Helper* result = 0; switch(advice.getType()) { case ONE: case TWO: { if(adv
Helper* HelperFactory::create(const Advice& advice, const Handler& ah)
{
Helper* result = 0;
switch(advice.getType())
{
case ONE:
case TWO:
{
if(advice.isTradeAdvice())
result = new SimpleHedgeHelper(advice, ah);
else
result = new SimpletradeHelper(advice, ah);
break;
}
case THREE
case FOUR:
case FIVE:
{
if(advice.isTradeAdvice())
result = new ComplexTradeHelper(advice, ah);
else
result = new ComplexHedgeHelper(advice, ah);
break;
}
case SIX:
{
if(!advice.getMsgID())
{
if(advice.isTradeAdvice())
result = new SimpleTradeHelper(advice, ah);
else
result = new SimpleHedgeHelper(advice, ah);
break;
}
else
{
if(advice.isTradeAdvice())
result = new ComplexRateHelper(advice, ah);
else
result = new ComplexHedgeHelper(advice, ah);
break;
}
}
}
我试图用一些模板化的基于策略的工厂来替换这个逻辑。我之前没有基于plicly设计过任何类。有人能建议如何设计吗?在考虑迁移到策略模板时,您应该评估是否可以使用这种方法考虑当前类之间的行为差异:
template <class Complexity_Policy, class Instrument_Policy>
class Helper : public Abstract_Helper
{
// for any function Helper needs...
virtual return_type f(arguments)
{
...can reference Complexity_Policy and/or Instrument_Policy members for behaviours...
}
};
当行为在很大程度上是正交的、不相关的/解耦的时,这种方法往往效果最好
如果您的所有客户端代码都希望继续使用运行时多态性,您仍然需要您的工厂,但它应该开始返回以下内容:
result = new Helper<Complexity_Policy__Simple, Instrument_Policy__Hendge>(advice, ah);
是的,我知道标识符中双下划线的标准用法。。。我确实接受这样的风险,即这将有未定义的行为,感觉实现中唯一可以想象的使用双下划线的方法是作为前缀或后缀。。。。对此问题不感兴趣,请继续讨论
您也可以选择性地直接使用模板实例化。另一种选择是,甚至不让Helper从任何基派生或拥有虚拟函数,而是使用抽象的\u Helper*get\u polympic\u访问器成员在顶部分层运行时多态性,该成员创建一个指针持有从Helper派生的类,该类转发调用/结果。[OT]:最好返回std::unique\u ptr@TemplateRex喝杯咖啡,重新考虑一下@昆汀啊,我的错,那些该死的骆驼壳的名字。谢谢托尼的快速回复。但重构当前的类层次结构对我来说不是一个选项:我在寻找某种解决方案,之后我应该能够通过传递type来获得正确的对象,在我的例子中,type是一个枚举值,类似于Factort f;f、 创造@user1545583:这听起来一点用处都没有,因为在创建这样一个f变量的每个上下文中,您都需要每个枚举都是编译时常量,这基本上意味着您当前工厂的switch/if/else链只是为了创建一个Factort变量并使用它间接调用new。。。。