[英]Using Policy Based design C++
我现在的类设计是这样的(我已经复制了类层次结构和函数调用。):
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
从任何基础派生或具有虚函数,而是使用Abstract_Helper* get_polymorphic_accessor()
成员在运行时多态性之上分层,该成员创建一个从Helper
派生的指针保持类,以转发调用/结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.