ストラテジーパターンを特定の状況に適用しようとしていますが、各具体的なストラテジーを、そのデータを提供するコンテキストオブジェクトに結合しないようにする方法に問題があります。以下は、いくつかの異なる方法で発生するパターンの単純化されたケースですが、同様の方法で処理する必要があります。
特定の時間枠に関連するデータを提供するオブジェクトがありAcquisitionます。基本的には、さまざまなハードウェアを使用して収集された一連の外部データです。含まれているデータの量のためにすでに大きすぎるので、それ以上の責任を負わせたくありません。ここで、このデータの一部を取得する必要があります。いくつかの構成に基づいて、対応する電圧をハードウェアに送信します。
したがって、次の(非常に単純化された)クラスを想像してください。
class Acquisition
{
public Int32 IntegrationTime { get; set; }
public Double Battery { get; set; }
public Double Signal { get; set; }
}
interface IAnalogOutputter
{
double getVoltage(Acquisition acq);
}
class BatteryAnalogOutputter : IAnalogOutputter
{
double getVoltage(Acquisition acq)
{
return acq.Battery;
}
}
ここで、すべての具体的な戦略クラスを私の取得クラスに結合する必要があります。これは、アプリケーションの中核であるため、変更される可能性が最も高いクラスの1つでもあります。これは、クラス内の巨大なswitchステートメントであった古い設計をまだ改善したものです。Acquisitionデータの種類ごとに変換方法が異なる場合があります(Batteryは単純なパススルーですが、他のデータはそれほど単純ではありません)。そのため、戦略パターンなどを使用する必要があると思います。
IAnalogOutputterまた、最終的な実装では、インターフェイスではなく抽象クラスになることにも注意してください。これらのクラスは、ユーザーが構成可能でXMLファイルにシリアル化されるリストに含まれます。リストは実行時に編集可能で記憶されている必要があるため、Serializableは最終的なソリューションの一部である必要があります。それが違いを生む場合に備えて。
最も重要なクラスの1つに結び付けずに、各実装クラスが機能するために必要なデータを確実に取得するにはどうすればよいですか?それとも、私はこの種の問題に完全に間違った方法で取り組んでいますか?