根据两种对象类型选择正确的策略

时间:2012-12-18 19:28:29

标签: c++ design-patterns dispatch

我不确定如何命名这个问题,所以我会尽力解释。

我希望能够根据两个不同对象的类型切换策略。为了使这个工作,我正在考虑用枚举类型标记对象,并具有这些策略的“注册表”(阵列)。理想情况下,可以通过一些简单的操作来访问正确的策略,例如两种类型之间的按位运算符。

这个伪代码可能使我想解释的内容更容易理解:

enum Type { A, B, C }

struct Object {
  Type type;
}

class ActionRunner {
  vector<Strategy> strategies;

  void registerStrategy(type1, type2, strategy) {
    strategies[type1 operator type2] = strategy;
  }

  void runStrategyFor(type1, type2) {
    strategies[type1 operator type2].execute();
  }
}

使用地图很容易解决这个问题,但是我想使用数组或向量,因为地图对于这样的问题来说似乎有些过分,使用数组可能要快得多。

所以问题是我不知道我可以用什么算子来选择正确策略的“位置”。我一直在考虑一些组合,但似乎所有这些组合最终都会在某些时候导致与不同组合的碰撞。

有没有人对我可能使用的内容有任何线索/建议?

PS:我知道过早的优化很糟糕,但我只想弄清楚这个问题能否以一种简单的方式解决。

------- EDIT --------------------------------------- ---------

根据答案,我一直在给这个问题一些额外的想法,我已经得出结论,我对这个问题的意图不可能按照我喜欢的方式。我将尝试使用这个问题重新陈述我现在试图解决的问题。

我希望有一个类结构,其中有某些类型的'BaseClass'对象和一个'处理器'对象,它接受从'BaseClass'派生的两个对象,并为这些对象运行正确的策略。像这样:

class Processor {
  void run (DerivedA a, DerivedB b);
}

class BaseClass {}
class DerivedA: public BaseClass {}
class DerivedB: public BaseClass {}

BaseClass a = new DerivedA;
BaseClass b = new DerivedB;

processor.run(a, b)

根据我的理解,这不会像我期望的那样,如果作为参数传递给'run'的是引用,这是我宁愿做的。有没有办法在没有太复杂的代码的情况下做到这一点? (tripple dispatch!?)

我想到的是双重调度与我认为可行的奴隶(处理器)对象相结合,但这看起来非常复杂,可能是维护和扩展的痛苦。

谢谢!

2 个答案:

答案 0 :(得分:0)

你问题的第二句话响了我一声:

  

我希望能够根据两个不同对象的类型切换策略。

这听起来像是要执行double dispatch。在Double dispatch/multimethods in C++查看问题(特别是问题的答案;-)),了解如何在C ++中实现它。

答案 1 :(得分:0)

这是使用map而不是数组的典型示例。 Array实际上是map的私有案例,其中键被定义为整数。在你的情况下,键是一个元组,所以一个简单的数组不会做,你最终会发生冲突(即使你的特定输入很幸运,你的代码也会非常强大)。

您可以在简单的arraymap之间建立一个中间解决方案:2D array,您的两种类型可作为行和列的索引。