5

SaveManager Abstractクラスと、SaveManager Abstractクラスを実装する具体的なクラスTVSaveManager、DataSaveManager、VoiceSaveManagerがあります。

List<SaveManager> lstPrdSaveManager;

        public SaveResponseModel SaveProducts(SaveProductsRequest objSaveProductsRequest)
        {
            SaveResponseModel saveResponseModel = new SaveResponseModel();

            lstPrdSaveManager = SaveManagerFactory.GetSaveManagers(objSaveProductsRequest, saveResponseModel);

            lstPrdSaveManager.ForEach(saveManager =>
                {
                    saveResponseModel = saveManager.MapAndSaveProduct();
                });


            return saveResponseModel;
        }

ファクトリクラスは、作成するマネージャーを決定し、リストを送信します。リストをループして、すべての具象クラスが準拠する共通インターフェース「MapAndSaveProduct」を呼び出します。私はもっ​​と戦略パターンが好きだと思います。

ただし、具体的なsavemanageのMapAndSaveProductメソッドの戻り型はすべて異なります。TvSaveManagerのTVResponseやDataSaveManagerのDataResponseなど。そこで、すべての戻り型をクラブ化するSaveResponseModelクラスを作成しました(SaveResponseModelをファクトリに渡して、すべての具象のsavemanagerクラスのコンストラクターに渡されるようにします。個々のクラスはTvSaveManager-> saveResponseModel.TvResponseのように目的のプロパティを設定します)。希望する結果が得られ、コードはきれいに見えます。

質問は、1)異なるタイプがある場合、このパターンを使用する正しい方法ですか?2)具象クラスの種類が異なる場合、戦略パターンを使用するべきではありませんか?3)この場合、別のデザインパターンにアプローチする必要があります。はいの場合、どれですか?

4

1 に答える 1

4

単一のメソッドグループに戦略訪問者の組み合わせがあります。これは絶対にOKです。応答に共通のインターフェースを与え、適切な応答を収集するために訪問者を追加することで、それらを分離することができます。これにより、両方を同時に適用するのではなく、2つのパターンを順番に適用します。

interface IResponseVisitor {
    void VisitTvResponse(TvResponse r);
    void VisitDataResponse(DataResponse r);
}
interface IResponse {
    void Accept(IResponseVisitor v);
}
class TvResponse : IResponse {
    public void Accept(IResponseVisitor v) {
        v.VisitTvResponse(this);
    }
}
class DataResponse : IResponse {
    public void Accept(IResponseVisitor v) {
        v.VisitDataResponse(this);
    }
}

これで、すべてのMapAndSaveProduct実装が共通のを返すことができますIResponse。それらをすべて収集してから、の実装を使用してそれらを調べ、対応するメソッドIResponseVisitor内で各タイプに必要なことを実行できます。Accept

于 2012-08-27T10:56:11.263 に答える