Шаблон проектирования для элемента управления ListView с двумя состояниями?

У меня есть элемент управления ListView в формах Windows, который должен отображать список элементов либо в представлении значков, либо в представлении сведений. Я хотел бы отделить логику состояния ListView и создать 2 класса состояний IconsState и DetailsState, унаследовав их от IState, имея все методы, которые нужно вызывать из окна пользовательского интерфейса.

В подробном представлении есть событие RetrieveVirtualItem, а в представлении значков — событие DrawItem. Чтобы вызывать их из переменной IState, присутствующей в пользовательском интерфейсе, оба класса-потомка State должны их реализовать. Наличие DrawItem в DetailsState не делает ничего, кроме возврата. То же самое для RetrieveVirtualItem в IconsState.

Есть ли другой подход к проектированию, чтобы избежать реализации пустых методов в состояниях?


person Chesnokov Yuriy    schedule 11.04.2012    source источник


Ответы (1)


Да, есть лучшие подходы. Заставлять класс иметь член, которого там быть не должно, то есть, по вашим словам, "Наличие DrawItem в DetailsState не дает ничего, кроме возврата".

В качестве альтернативы вы можете использовать паттерн MVP, который позволит вам гораздо лучше тестировать. В варианте MVP с пассивным представлением у вас будет одна модель, два простых представления и презентатор, который решает, какое представление отображать, в зависимости от выбора пользователя.

Дополнительные ресурсы по MVP:
тег SO для MVP
Пример пассивного просмотра
примеры MVP для Windows Forms

person oleksii    schedule 11.04.2012
comment
Ну, я использую MVP, и форма Windows, имеющая элемент управления ListView, уже является представлением. Мне нужно было простое разделение поведения элемента управления ListView в моей форме окна просмотра. Я не могу себе представить, чтобы у меня было 2 MVP, и я не могу создать еще один MVP только для элемента управления ListView в моем представлении формы Windows. - person Chesnokov Yuriy; 11.04.2012
comment
AFAI понял, ваше представление ListView может быть либо представлением значков, либо представлением сведений, если это так, вы можете использовать, скажем, MVP внутри MVP, другими словами, родительское представление может отображать любое из представлений, не должно быть никаких проблемы, чтобы сделать вид MVP компонуемым - person oleksii; 11.04.2012