使用基于策略的设计C ++

时间:2014-08-07 06:39:33

标签: c++ policy-based-design

我现在的类设计是这样的(我已经复制了类层次结构和函数调用。):

  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设计过任何类。有人可以建议设计应该如何吗?

1 个答案:

答案 0 :(得分:0)

在考虑转移到策略模板时,您应该评估使用这种方法是否可以考虑当前类之间的行为差​​异:

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);

(是的,我确实知道标准保留在标识符中使用双下划线...我确实接受这将具有未定义行为的风险,感觉唯一可以想象的使用双下划线实现可能作为前缀或后缀....不想对这个Q进行侧面跟踪以进一步讨论。)。

您也可以选择性地直接使用模板实例化。另一个选择是甚至没有Helper派生自任何基础或具有虚函数,而是使用Abstract_Helper* get_polymorphic_accessor()成员在顶层分层运行时多态性,该成员创建从Helper派生的指针保持类转发电话/结果。