Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Висячие ссылки на удаленные объекты

Читайте также:
  1. А.4.1 Общие ссылки
  2. Библиографические ссылки
  3. Библиографические ссылки
  4. Все объекты классового типа размещаются динамически
  5. Гиперссылки
  6. Глава 20. Объекты пользователя

К ЛАБОРАТОРНЫМ РАБОТАМ №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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
ученик: Земля узнала человека, проложившего дорогу к звездам, он стал героем всей Земли. Так появилось слово «космонавт».| Загальна характеристика проекту

mybiblioteka.su - 2015-2024 год. (0.008 сек.)