русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Реалізація патерна Observer


Дата додавання: 2014-10-07; переглядів: 832.


Реалізація патерна Observer по кроках

1. Змоделюйте "незалежну" функціональність за допомогою абстракції "суб'єкт".

2. Змоделюйте "залежну" функціональність за допомогою ієрархії "спостерігач".

3. Клас Subject пов'язаний тільки c базовим класом Observer.

4. Спостерігачі реєструються у суб'єкта.

5. Суб'єкт сповіщає всіх зареєстрованих спостерігачів.

6. Спостерігачі "витягують" необхідну їм інформацію від об'єкта Subject.

7. Клієнт налаштовує кількість і типи спостерігачів.

 

#include <iostream> #include <vector> using namespace std;   // 1. "Независимая" функциональность class Subject { // 3. Связь только базовым классом Observer vector < class Observer * > views; int value; public: void attach(Observer *obs) { views.push_back(obs); } void setVal(int val) { value = val; notify(); } int getVal() { return value; } void notify(); };   // 2. "Зависимая" функциональность class Observer { Subject *model; int denom; public: Observer(Subject *mod, int div) { model = mod; denom = div; // 4. Наблюдатели регистрируются у субъекта model->attach(this); } virtual void update() = 0; protected: Subject *getSubject() { return model; } int getDivisor() { return denom; } };   void Subject::notify() { // 5. Извещение наблюдателей for (int i = 0; i < views.size(); i++) views[i]->update(); }   class DivObserver: public Observer { public: DivObserver(Subject *mod, int div): Observer(mod, div){} void update() { // 6. "Вытягивание" интересующей информации int v = getSubject()->getVal(), d = getDivisor(); cout << v << " div " << d << " is " << v/d << '\n'; } };   class ModObserver: public Observer { public: ModObserver(Subject *mod, int div): Observer(mod, div){} void update() { int v = getSubject()->getVal(), d = getDivisor(); cout << v << " mod " << d << " is " << v%d << '\n'; } };   int main() { Subject subj; DivObserver divObs1(&subj, 4); // 7. Клиент настраивает число DivObserver divObs2(&subj, 3); // и типы наблюдателей ModObserver modObs3(&subj, 3); subj.setVal(14); }

Вивід програми:

14 div 4 is 3 14 div 3 is 4 14 mod 3 is 2

 


<== попередня лекція | наступна лекція ==>
Приклад патерна Observer | Реалізація патерну Observer: до та після


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн