|
русс | укр
Программування
Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог1С Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование
Навчання
Linux
Unix
Алгоритмічні мови
Архітектура мікроконтролерів
Введення в розробку розподілених інформаційних систем
Дискретна математика
Інформаційне обслуговування користувачів
Інформація та моделювання в управлінні виробництвом
Комп'ютерна графіка
Лекції
|
Реалізація патерна Observer
Дата додавання: 2014-10-07; переглядів: 927.
Реалізація патерна 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
|
|
Онлайн сервіси
Онлайн система числення
Калькулятор онлайн звичайний
Науковий калькулятор онлайн
| |