我不知道如何命名这个问题,所以我会尽量解释清楚。
我希望能够根据两个不同对象的类型切换策略。为了完成这项工作,我正在考虑使用枚举类型标记对象,并拥有这些策略的“注册表”(数组)。理想情况下,正确的策略可以通过一些简单的操作来访问,比如两种类型之间的位运算符。
这个伪代码可能会使我试图解释的内容更容易理解:
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)
据我了解,如果作为参数传递给“运行”的是引用,这将不会像我预期的那样工作,这是我宁愿做的。没有太复杂的代码有没有办法做到这一点?(三连发!?)
我想到了双重调度与我认为可以工作的从属(处理器)对象相结合的东西,但这似乎非常复杂,维护和扩展可能很痛苦。
谢谢!