Читайте также: |
|
К ЛАБОРАТОРНЫМ РАБОТАМ №2,3
«Паттерн проектирования Observer (наблюдатель)»
ПО ДИСЦИПЛИНЕ
«Объектно-ориентированное проектирование»
Работу выполнила студентка группы М-72 | И.И.Купцова | |||
подпись, дата | ||||
Работу проверил | С. А. Булгаков | |||
подпись, дата | ||||
Постановка задачи
Выполнить реализацию паттерна проектирования Наблюдатель на языке программирования Си++. Для предотвращения висячих ссылок на объекты класса ConcretSubject и ConcreteObserver реализовать дополнительную связь.
Организовать возможность наблюдения одним объектом ConcreteObserver за несколькими объектами ConcreteSubject. Изменить интерфейсы классов Subject и Observer из лабораторной работы 2 следующим способом:
А) класс Subject – открытые члены:
void Notify();
Б) класс Observer – открытые члены:
void Update();
Ввести глобальную функцию void Connect(Subject*, Observer*).
Проверить правильность работы программы создав 1000 объектов ConcreteObserver и 10000 объектов ConcreteSubject, связав каждого наблюдателя с каждым объектом.
Произвести поочередное удаление 100 субъектов и 1000 наблюдателей пока не останется половина объектов, вызывая метод Notify() у каждого субъекта перед удалением.
Метод Notify должен выводить на экран указатель вызывающего объекта и объекта, у которого вызывается метод Update.
Метод Update должен выводить на экран указатель объекта у которого он вызывается.
Метод Update – чисто виртуальный.
Классы Subject и Observer - абстрактные.
Алгоритм решения задачи
Для решения задачи были разработаны следующие классы:
¾ Subject - интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей;
¾ Observer - интерфейс, с помощью которого наблюдатель получает оповещение;
¾ ConcreteSubject - конкретный класс, который посылает информацию своим наблюдателям, когда происходит изменение;
¾ ConcreteObserver - конкретный класс, который реализует интерфейс обновления, определенный в классе Observer, чтобы поддерживать согласованность с субъектом.
Решение задачи
Класс Observer
Интерфейс наблюдателя определен в абстрактном классеObserver, отделим объявление (Листинг 1) от реализации (Листинг 2).
Поля класса Observer:
¾ list<Subject *> subjects – список объектов класса Subject, в котором мы будем хранить информацию обо всех субъектах, за которыми следит наш наблюдатель;
¾ чисто виртуальный метод Update();
¾ метод connect(Subject*) – регистрирует субъект у наблюдателя, то есть помещает субъект в конец списка;
¾ метод disconnect(Subject*) – удаляет субъект из списка;
¾ деструктор ~Observer().
Так же в этом классе объявляем дружественный класс Subject и дружественную глобальную функцию connect(Subject*, Observer*).
Класс Subject
Интерфейс субъекта определен в абстрактном классе Subject (Листинг 3, 4).
Поля класса Subject:
¾ list<Observer *> observers – список объектов класса Observer, в который мы будем помещать информацию обо всех наблюдателях, которые следят за нашим субъектом;
¾ метод Notify() – оповещает об изменении состояния одного объекта, а все зависящие от него объекты обновляются; выводит на экран указатель вызывающего объекта и объекта, у которого вызывается метод Update;
¾ метод Attach(Observer*) – позволяет наблюдателю присоединиться к субъекту, то есть помещает наблюдателя в список;
¾ метод Detach(Observer*) – отсоединяет наблюдателя от субъекта;
¾ деструктор ~Subject().
Объявляем дружественный класс Observer и дружественную глобальную функцию connect(Subject*, Observer*).
Висячие ссылки на удаленные объекты
Рассмотрим случай удаления субъекта (так как удаление наблюдателя происходит аналогичным образом). Удаление субъекта не должно приводить к появлению висячих ссылок у наблюдателя. Для того чтобы избежать этого мы поручим субъекту уведомлять все свои наблюдатели о своем удалении, чтобы они могли уничтожить все хранимые у себя ссылки. В общем случае простое удаление наблюдателей не годится, так как на них могут ссылаться другие объекты и под их наблюдением могут находиться другие субъекты.
После того как все наблюдатели удалили ссылки на удаляемый объект, мы удаляем контейнер с хранимой информацией о наблюдателях.
На диаграмме последовательности наглядно продемонстрирован процесс удаления субъекта.
Дата добавления: 2015-10-28; просмотров: 181 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ученик: Земля узнала человека, проложившего дорогу к звездам, он стал героем всей Земли. Так появилось слово «космонавт». | | | Загальна характеристика проекту |