Лекция 13

Каждый раз, когда нам нужно отрисовать все квадраты на панельках, нам придется в цикле обращаться к хранилищу квадратов, то есть в ядро. Это очень накладно.

 

 
 

 

 


Есть два способа решения этой проблемы:

1) Можно хранить указатели на квадраты в панелях, чтобы не использовать цикл,

2) Создать в GUI свой класс «квадрат», который будет заниматься отрисовкой квадратов.

Вернемся к нашему обозревателю. Он преобразится:

 
 

 

 


 

Это реализуется в логической сетке: мы берем координаты монитора, преобразуем их в логические и сохраняем в ядро.

Для того, чтобы сделать Controller, создадим родительский чисто абстрактный класс (или интерфейс).

Для вывода данных из ядра в вид используется Observer. Он представляет собой интерефейс, MainField и ToolBox наследуются от него.

Цель Subject заключается в том, чтобы наблюдать. Он выполняет основные функции – хранит сведения о видах. Это реализуется в Drawing, наследуемом от Subject. Также Subject добавляет, удаляет и изменяет данные, хранящиеся в коллекции.

В Manager'е в метод е добаления фигуры мы делаем запрос на обновление видов из ядра.

У Subject есть метод notify, который работает со всеми обозревателями. Он проходит всю коллекцию и вызывает метод Update.

ToolBox реализует обозревателя, там мы и опишем метод Update. Берем указатель на Manager'а, перебираем все фигуры, удаляем все панели и потом заново их добавляем.

Получается, что у наблюдателя есть подписчики, и он рассылает им запросы на обновления.

 

Теперь поговорим о паттерне Fasade.

Работу не слишком хорошо сконструированного приложения можно представить так:

 
 

 

 


А хорошо построенное приложение работает так:

 
 

 


Итак, мы создадим унифицированную точку вхождения в систему, класс, разделяющий логику всего приложения на отдельные по функционалу куски. Проще говоря, «Фасад» — есть ни что иное, как некоторый объект, аккумулирующий в себе высокоуровневый набор операций для работы с некоторой сложной подсистемой. Фасад агрегирует классы, реализующие функциональность этой подсистемы, но не скрывает их. Важно понимать, что клиент, при этом, не лишается более низкоуровневого доступа к классам подсистемы, если ему это, конечно, необходимо. Фасад упрощает выполнение некоторых операций с подсистемой, но не навязывает клиенту свое использование.

По сути, Manager и является нашим фасадом.

Fasade реализуется через SinleTon, который возвращает нам объект менеджера, с помощью которого мы получаем доступ к DAO и который «работает» обозревателем.