c# - 当我们有不同的返回类型时实现策略模式

标签 c# wcf oop design-patterns ooad

我有 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;
        }

工厂类将决定创建哪个管理器并将列表发送给我们。我将遍历列表并调用每个具体类都将遵循的公共(public)接口(interface)“MapAndSaveProduct”。我猜更像是一种策略模式。

但是所有具体的 savemanage 的 MapAndSaveProduct 方法返回类型都是不同的。 TvSaveManager 的 TVResponse 和 DataSaveManager 的 DataResponse 等等。所以我创建了 SaveResponseModel 类来组合所有返回类型(我将 SaveResponseModel 传递给工厂,以便它将传递给所有具体的 savemanager 类的构造函数。各个类将设置所需的属性,如 TvSaveManager -> saveResponseModel.TvResponse)。我得到了想要的结果,代码看起来很干净。

问题是, 1)当我们有不同的类型时,使用这种模式是正确的方法吗? 2)如果具体类有不同的类型,我们不应该使用策略模式吗? 3)在这种情况下,我应该采用不同的设计模式吗?如果是,哪一个?

最佳答案

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

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

关于c# - 当我们有不同的返回类型时实现策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12140498/

相关文章:

.net - 最大数组长度配额

c# - 从 WCF 服务流式传输文件

wcf - 如何在特定端口上运行 WCF 服务

c# - WinApi SendMessage/PostMessage 在我的电脑上不工作?

c# - 如何只生成一个 PDF

c# - Sitecore 创建包含字段 [] 的项目

c# - 将不可预测的 JSON 属性反序列化为字符串

java - 为什么在面向对象的编程中,要在变量中实例化对象的父类(super class)和子类?

c# - 使用Createmany动态设置类型

Javascript 伪类、jQuery 事件处理程序和 'this'