我不知道如何命名这个问题,所以我会尽力解释。根据两种对象类型选择正确的策略
我希望能够根据两个不同对象的类型切换策略。为了使这个工作,我想用一个枚举类型标记对象,并有这些策略的“注册表”(阵列)。理想情况下,正确的策略可以通过一些简单的操作来访问,如两种类型之间的按位运算符。
这种伪可能会让我尝试解释更容易理解:
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:我知道不成熟的优化是不好的,但我只是想弄明白这个问题是否可以用简单的方法解决。
-------编辑-------------------------------------- ----------
鉴于答案,我一直在给这个问题一些额外的想法,我已经得出结论,我打算用这个问题是不可能的方式我喜欢它。我将尝试使用这个问题重新陈述我现在要解决的问题。
我想要一个类结构,其中有一些特定类型的对象'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)
据我了解,这不会好像什么作为参数,以“跑”过去,我所期待的工作是引用,这是我宁愿做。有没有办法做到这一点没有方式太复杂的代码? (tripple dispatch !?)
我记得像双重调度与一个奴隶(处理器)对象,我认为会工作,但这似乎非常复杂,可能是一个维护和扩展的痛苦。
谢谢!
你可以尝试短语你正在试图做的更好呢?也许还要通过示例来展示它。 – Dukeling