Вопрос философии дизайна:
- Предположим, у меня есть пользовательский элемент управления, который рисует график характеристик коллекции объектов.
- Элемент управления помещается в форму с долгоживущим классом контроллера, который предоставляет коллекцию объектов для рисования.
- Форма также содержит элемент управления, который позволяет переключаться между «режимами» или различными стилями печати. Логика, заключающаяся в том, что объекты, извлекаемые из использования для раскрытия их общедоступных свойств, в разных режимах принципиально различаются, но элемент управления не заботится об этом.
- Первоначальное кэширование данных для экземпляров объекта довольно трудоемко и вызывает проблемы с производительностью некоторых функций элемента управления отображением.
- Несмотря на разную логику, экземпляры объектов представляют один и тот же набор переменных / вещей моделирования (как бы вы ни хотели их представлять) до и после смены режима
Природа проблемы в пункте 3 предполагает, что собранные экземпляры следует рассматривать как абстрактные основы, и существуют два разных производных класса с различной внутренней логикой. К сожалению, это говорит о том, что весь набор объектов должен быть полностью регенерирован при каждом переключении режима, что приводит к потере тактов.
Есть ли у кого-нибудь примеры аккуратного шаблона для передачи кэшированных данных между различными реализациями базы? Я рассмотрел перегруженный конструктор, который берет экземпляр базового класса, но на первый взгляд это звучит довольно ужасно. Может быть, люди не согласны с этим стилем, и в этом случае я считаю, что вопрос исчерпан.
edit # 1:
Некоторые уточнения специфики этой проблемы; Я предположил, что мой первоначальный вопрос был, вероятно, довольно расплывчатым ...
Пусть свойство привязки, которое элемент управления присоединяет, например, List<BaseClass> ControllerClass.Items
.
Пусть свойства, которые элемент управления запрашивает для выполнения своей работы, будут такими, как
double BaseClass.NumericProperty
IEnumerable<Thing> BaseClass.AggregateProperty
Пусть будет (как минимум) два разных подкласса BaseClass
, называемых DerivedClass1
и DerivedClass2
. Когда управление переключает режим, намерение состоит в том, что ControllerClass.Items
будет представлять список элементов, которые выполняют соответствующую внутреннюю логику для предоставления этих свойств.
Я предлагаю, чтобы внутри переключателя режима, т.е. установки Controller.Mode = NewMode
, контроллер создал новый набор DerivedClass2
, выполнив что-то вроде _list_internal[i] = new DerivedClass2(_list_internal[i])
, где _list_internal в настоящее время содержит набор DerivedClass1
с, затем вызвать событие (например, INotifyPropertyChanged или что-то еще), чтобы сообщить элемент управления. Конструкторы DerivedClass1
и DerivedClass2
принимают BaseClass
в качестве аргумента, который разбит на части для извлечения данных, которые будут общими для обоих.
Мой вопрос: это признанный паттерн? если нет, то почему, и каковы альтернативы, учитывая эффективность и необходимость не выбрасывать данные каждый раз, когда пользовательский интерфейс что-то делает.