【问题标题】:Achieve strategy pattern when we have different return type当我们有不同的回报类型时实现策略模式
【发布时间】:2012-08-21 20:29:08
【问题描述】:

我有 SaveManager 抽象类和实现 SaveManager 抽象类的具体类 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)在这种情况下,我是否应该采用不同的设计模式。如果是,是哪一个?

【问题讨论】:

  • 你想达到什么目的?您正在尝试通过设计解决什么问题?
  • 我没有得到“具体 savemanage 的返回类型不同”SaveManager 是一堂课吧?但返回类型与 Method 相关联。
  • 是的mohayemin。它的 MapAndSaveProduct 返回类型不同

标签: c# wcf oop design-patterns ooad


【解决方案1】:

您在一组方法中组合了StrategyVisitor;这绝对没问题。您可以通过为响应提供一个通用界面并将它们分开,并向其添加访问者以获取正确的响应。这将按顺序应用两种模式,而不是同时应用两种模式。

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 方法中为每种类型执行所需的操作。

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多