采用基于策略的c++设计
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;
}
}
}
我正在尝试用一些基于策略的模板工厂来代替这个逻辑。我之前没有根据政策设计过任何课程,请问设计应该是怎样的?
在考虑转向策略模板时,您应该评估当前类之间的行为差异是否可以使用这种方法来考虑:
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
派生的指针持有类,该类转发调用/结果。
相关文章:
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 询问在设计我的手臂模拟器功能表示格式1
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 资源管理设计模式
- 多态杆件变量 - 类设计
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 设计将引用元素移动到开头的数据结构.C++
- С++ wxWidgets:代码架构,设计原则和模式
- 用于在回调中调用解析器的设计模式
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 需要为 C++ 中的以下问题设计递归算法
- 使用 SFINAE 设计模板方法
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?