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

У меня есть абстрактный класс 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;
        }

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

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

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


person Al.    schedule 27.08.2012    source источник
comment
Чего вы хотите достичь? С какой проблемой вы столкнулись, которую вы пытаетесь решить с помощью своего дизайна?   -  person Serg Rogovtsev    schedule 27.08.2012
comment
Я не получил конкретный тип возврата savemanage отличается. SaveManager это класс, верно? Но тип возвращаемого значения связан с методом.   -  person Mohayemin    schedule 27.08.2012
comment
да мохаемин. его тип возврата MapAndSaveProduct отличается   -  person Al.    schedule 27.08.2012


Ответы (1)


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

person Sergey Kalinichenko    schedule 27.08.2012