Достичь стратегии, если у нас есть другой тип возврата

90
14

У меня есть класс SaveManager Abstract и мои конкретные классы TVSaveManager, DataSaveManager и VoiceSaveManager, реализующие класс SaveManager Abstract.


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


Factory класс решит, какой менеджер должен создать и отправить нам список. Я перейду через список и вызову общий интерфейс "MapAndSaveProduct", который будет придерживаться каждый конкретный класс. Я предполагаю больше или как шаблон стратегии.


Но все дело в конкретном методе возврата метода MapAndSaveProduct конкретного типа. TVResponse для TvSaveManager и DataResponse для DataSaveManager и т.д. Поэтому я создал класс SaveResponseModel для объединения всех типов возвращаемых данных (я передаю SaveResponseModel в factory, чтобы он передавался всем конкретным конструкторам класса savemanager. Индивидуальный класс задает желаемое свойство., Например TvSaveManager → saveResponseModel.TvResponse), Я получаю желаемый результат, и код выглядит чистым.


Вопросы,
1) Правильно ли это использовать этот шаблон, когда у нас есть другой тип?
2) Если конкретный класс имеет разные типы, не следует ли использовать шаблон стратегии?
3) Должен ли я подходить к разной схеме дизайна в этом случае. если да, то какой?

спросил(а) 2021-01-25T17:16:33+03:00 4 месяца, 2 недели назад
1
Решение
76

У вас есть комбинация 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.

ответил(а) 2021-01-25T17:16:33+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема