需要战略模式帮助

时间:2010-12-29 23:47:09

标签: java design-patterns strategy-pattern

存在interface Algorithm

存在class MathAlgorythm implements Algorithm (returns MathResult, which implements Result

存在class ChemitryAlgorythm implements Algorithm (returns ChemitryResult, which implements Result

此外,还有一个Context class,用于将数据传递给这些Algos。数据以下列方式传递:

public Result executeStrategy(Data data) {
    return algo.execute(data);
}

假设我,executeStrategy然后回来     return MathAlgorithm.execute(data);我得到类型的结果吗?

然后我执行     return ChemitryAlgorithm.execute(data);我又得到了一些结果

问题: 结果是一个界面。我需要以MathResult或ChemistryResult的形式获得对具体类实现的访问权限。换一种说法。一旦我得到类型结果的东西,我需要深入挖掘并知道隐藏在界面背后的类

我希望这种散漫不会太混乱。

感谢您阅读和回复

4 个答案:

答案 0 :(得分:2)

如果你给Result一个类似T get()的方法,具体的实现必须实现,那么你不需要知道具体的实现。

答案 1 :(得分:0)

不确定我是否理解了你的问题但是要知道你可以使用getClass()的实例的具体类,或者使用instanceof来检查它是否是MathResult等。小心你不要打败实现结果的全部要点接口

答案 2 :(得分:0)

确保您的Result界面足够强大以满足所有客户端。这是关键,这样你就不会打破多态透明度。

如果您真的,真的真的需要知道具体类型,您可以使用getClass,某种唯一ID和吸气剂,或者(最好的) )将行为吸收到具体Result类的操作中。

答案 3 :(得分:0)

怎么样:

interface Algorithm<R extends Result, D extends Data> {
  T execute data(D data);
}

然后您的MathAlgorithm实现将如下所示:

class MathAlgorithm implements Algorithm<MathResult, MathData> {
  public MathResult execute(MathData data) {
    // do whatever
    return <instance of MathResult>;
  }
}

用法:

MathResult mathResult = new MathAlgorithm().execute(someMathData);