Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 92; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.176 (0.009 с.) |