如果具体策略取决于具体参数类型

时间:2015-09-24 16:47:44

标签: c++ strategy-pattern

我目前正在使用如下实现的系统/数据层次结构:

class SystemData
{
}

class SystemDataA : public SystemData
{
  int x;
}

class SystemDataB : public SystemData
{
  float y;
}

class System
{
  virtual SystemData* getData() = 0;
  virtual Result computeData(SystemData*) = 0;
}

class SystemA : public System
{
  // really returns SystemDataA
  SystemData* getData() override;
  Result computeData(SystemData*) override;
}

class SystemB : public System
{
  // really returns SystemDataB
  SystemData* getData() override;
  Result computeData(SystemData*) override;
}

最后有一个类似于此的控制器类:

void foo()
{
  for(auto& s : systemVec)
  {
    SystemData* data = s->getData();
    FinalResult final = s->computeData(data);
  }
}

现在每个特定的系统dynamic_casts回到它能够处理的具体类型。这似乎是非常糟糕的设计,我想将其重构为更合理的。我的第一个想法是在SystemData类中实现计算算法,然后执行:

SystemData* data = s->getData();
FinalResult final = data->compute();

但它真的属于那里吗? 具有单独的算法层次结构似乎更直观,可能使用策略模式实现。然而,我再次遇到丢失数据的运行时类型信息的问题,因为所有算法都传递了抽象数据类型,最后必须动态转换并再次进行nullptr和错误检查。那么在数据类本身内部实现算法还是更好吗?我是否仍然可以在单独的模块中实现层次结构,只需将函数指针或类似的构造添加到数据类中?是否有一个完全不同的解决方案我不知道?

0 个答案:

没有答案