2010-12-29 19 views
2

を必要interface Algorithm戦略パターンの助けが

class MathAlgorythm implements Algorithm(returns MathResult, which implements Resultが存在するとされている)

class ChemitryAlgorythm implements Algorithm(returns ChemitryResult, which implements Resultが存在する)

さらに、これらのALGOSにデータを渡すために使用されContext classは、そこに存在します。データは次のように渡されます。

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

は、私は右のタイプ結果の何かを得る私は、executeStrategyを想定し、バック return MathAlgorithm.execute(data);を取得しますか?

私はその後、実行 return ChemitryAlgorithm.execute(data);は再び私は何かの結果を得る

質問: 結果はインタフェースです。私はMathResultやChemistryResultのような具象クラスの実装にアクセスする必要があります。言い換えると。 Result型のものが得られたら、深く掘り下げてインターフェイスの背後に隠れているクラスを知る必要があります

私はこの散歩があまり混乱しないことを望みます。あなたは具体的な実装が実装しなければならないT get()ような方法は、あなたが具体的な実装について知る必要はありませんResultを与える場合

は読書と

+2

それはで、道 'algorithm'によってです「私」。 – BalusC

+0

戦略は通常、異なるアルゴリズムを使用して(本質的に)同じ結果を与える場合に使用されます。だから、より良い例は、異なる戦略がSteepestDescentsまたはConjugateGradientsであるオプティマイザです。数学と化学を代替ストラテジーと見なすことは困難です。 (これが必要なすべての場合、結果に戦略クラスのフィールドがある可能性があります) –

+0

あなたは正しいです。ここでの挑戦はまったく同じです - 同じ傘の下で異なる結果をグループ化してください。数学と化学の両方が同じ物を返すなら、問題はなかったでしょう。私はgoogleのオプティマイザ今 – JAM

答えて

2

を対応していただきありがとうございます。

+0

ありがとう。これはうまく動作します – JAM

0

私はあなたの質問を理解していますが、getClass()を使うことができるインスタンスの具体的なクラスを知っているか、instanceofを使ってMathResultなどであるかどうかを確認することはできません。結果インタフェース。

0

Resultインターフェイスがすべてのクライアントを満たすのに十分強くあることを確認してください。これが重要なので、多態的な透明性を損なうことはありません。

あなたは本当に、本当に本当にあなたははgetClass、ユニークIDとゲッターのいくつかの並べ替えを使用し、または(最も好ましくは)の操作に行動を吸収するか、具体的なタイプを知る必要がある場合具体的な結果クラス。

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); 
+0

ありがとうございます。問題は、結果を得るときに、私はMathResultまたはChemistryResultを取得したくないということです。私は、可能ならば、結果がほしいと思う。私はそれを得ると、私はそれがどんな種類の結果であり、そこから行くのか見たいと思います。 – JAM

関連する問題