Al.*_*Al. 5 c# oop wcf ooad design-patterns
我有 SaveManager 抽象类和具体类 TVSaveManager、DataSaveManager 和 VoiceSaveManager 实现 SaveManager 抽象类。
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;
}
Run Code Online (Sandbox Code Playgroud)
工厂类将决定创建哪个管理器并向我们发送列表。我将循环遍历列表并调用每个具体类都将遵守的公共接口“MapAndSaveProduct”。我想更多或者更像是一种策略模式。
但问题是所有具体的 savemanage 的 MapAndSaveProduct 方法的返回类型都是不同的。TvSaveManager 的 TVResponse 和 DataSaveManager 的 DataResponse 等等。因此,我创建了 SaveResponseModel 类来组合所有返回类型(我将 SaveResponseModel 传递给工厂,以便它将传递给所有具体的 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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您的所有MapAndSaveProduct实现都可以返回通用的IResponse. 您可以将它们全部收集起来,然后使用 的实现来遍历它们IResponseVisitor,并在相应的方法中为每种类型执行您需要的操作Accept。