Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Использование паттерна Observer
1. Проведение различия между основной (или независимой) и дополнительной (или зависимой) функциональностями. 2. Моделирование "независимую" функциональность с помощью абстракции "субъект". 3. Моделирование "зависимую" функциональность с помощью иерархии "наблюдатель". 4. Класс Subject связан только c базовым классом Observer. 5. Клиент настраивает количество и типы наблюдателей. 6. Наблюдатели регистрируются у субъекта. 7. Subject извещает всех зарегистрированных наблюдателей. 8. Subject может "протолкнуть" информацию в наблюдателей, или наблюдатели могут "вытянуть" необходимую им информацию от объекта Subject.
Вывод программы:
#include <iostream> #include <string> #include <list> using namespace std; class Supervised String; Class IObserver { public: virtual void handleEvent(const SupervisedString&) = 0; }; Class SupervisedString // Observable class { string _str; list<IObserver* const> _observers; void _Notify() { for(auto iter: _observers) { iter->handleEvent(*this); } } public: void add(IObserver& ref) { _observers.push_back(&ref); } void remove(IObserver& ref)
{ _observers.remove(&ref); } const string& get() const { return _str; } void reset(string str) { _str = str; _Notify(); } }; class Reflector: public IObserver // Prints the observed string into cout { public: virtual void handleEvent(const SupervisedString& ref) { cout << ref.get() << endl; } }; Class Counter: public IObserver // Prints the length of observed string into cout { public: virtual void handleEvent(const SupervisedString& ref) { cout << "length = " << ref.get().length() << endl; } }; Int main() { SupervisedString str; Reflector refl; Counter cnt; str.add(refl); str.reset("Hello, World!"); cout << endl; str.remove(refl); str.add(cnt); str.reset("World, Hello!"); cout << endl; return 0; } Рассмотрим еще раз саму идею паттерна, его применение и реализацию. Наблюдатель – поведенческий шаблон проектирования. Данный шаблон проектирования встречается под именем “подчиненные” (Dependents), “издатель-подписчик” (Publisher-Subscriber). Смысл данного паттерна заключается в том, что если объект обновляется, то все его зависимые объекты обновляются так же. Рассмотрим случай, в которых может быть применен, если система обладает следующими свойствами:
Диаграмма классов представлена ниже.
Основными элементами в данном паттерне являются объект наблюдения (Subject) и реализация различных наблюдателей (extends Observer). Будем хранить всех наблюдателей объекта непосредственно в нем. Реализуем паттерн наблюдатель, в основу идеи положим оповещение учителя и родителей (Наблюдателей) об полученной учеником (Subject) оценке. Абстрактный класс Observer содержит абстрактный метод update, который реализует каждый из конкретных наблюдателей в зависимости от своих целей. Так же класс Observer содержит ссылку на субъект, за которым он наблюдает. Реализация представлена ниже:
|
||||||||
Последнее изменение этой страницы: 2021-11-27; просмотров: 33; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.63.174 (0.014 с.) |