Лекция 13
Каждый раз, когда нам нужно отрисовать все квадраты на панельках, нам придется в цикле обращаться к хранилищу квадратов, то есть в ядро. Это очень накладно.
Есть два способа решения этой проблемы:
1) Можно хранить указатели на квадраты в панелях, чтобы не использовать цикл,
2) Создать в GUI свой класс «квадрат», который будет заниматься отрисовкой квадратов.
Вернемся к нашему обозревателю. Он преобразится:
Это реализуется в логической сетке: мы берем координаты монитора, преобразуем их в логические и сохраняем в ядро.
Для того, чтобы сделать Controller, создадим родительский чисто абстрактный класс (или интерфейс).
Для вывода данных из ядра в вид используется Observer. Он представляет собой интерефейс, MainField и ToolBox наследуются от него.
Цель Subject заключается в том, чтобы наблюдать. Он выполняет основные функции – хранит сведения о видах. Это реализуется в Drawing, наследуемом от Subject. Также Subject добавляет, удаляет и изменяет данные, хранящиеся в коллекции.
В Manager'е в метод е добаления фигуры мы делаем запрос на обновление видов из ядра.
У Subject есть метод notify, который работает со всеми обозревателями. Он проходит всю коллекцию и вызывает метод Update.
ToolBox реализует обозревателя, там мы и опишем метод Update. Берем указатель на Manager'а, перебираем все фигуры, удаляем все панели и потом заново их добавляем.
Получается, что у наблюдателя есть подписчики, и он рассылает им запросы на обновления.
Теперь поговорим о паттерне Fasade.
Работу не слишком хорошо сконструированного приложения можно представить так:
А хорошо построенное приложение работает так:
Итак, мы создадим унифицированную точку вхождения в систему, класс, разделяющий логику всего приложения на отдельные по функционалу куски. Проще говоря, «Фасад» — есть ни что иное, как некоторый объект, аккумулирующий в себе высокоуровневый набор операций для работы с некоторой сложной подсистемой. Фасад агрегирует классы, реализующие функциональность этой подсистемы, но не скрывает их. Важно понимать, что клиент, при этом, не лишается более низкоуровневого доступа к классам подсистемы, если ему это, конечно, необходимо. Фасад упрощает выполнение некоторых операций с подсистемой, но не навязывает клиенту свое использование.
По сути, Manager и является нашим фасадом.
Fasade реализуется через SinleTon, который возвращает нам объект менеджера, с помощью которого мы получаем доступ к DAO и который «работает» обозревателем.