当我们有不同的回报类型时,实现策略模式



我有SaveManager Abstract类和实现SaveManager Abtract类的具体类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类来结合所有的返回类型(我将SaveResponceModel传递到工厂,这样它将被传递到所有具体的savemanager类的构造函数。单个类将设置所需的属性。如TvSaveManager->SaveResponseModel.TvResponse)。我得到了所需的结果,代码看起来很干净。

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

您在一组方法中得到了策略访问者的组合;这是完全可以的。你可以通过给响应一个公共接口,并添加一个访问者来获取正确的响应,从而将它们分离出来。这将按顺序应用两种模式,而不是同时应用这两种模式。

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

最新更新