русс | укр

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

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


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


Реалізація патерну Observer: до та після


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


До

Кількість та типи «залежних» об’єктів визнааються класом Subject. Користувач не має можливості впливати на цю конфігурацію.

class DivObserver

{

int m_div;

public:

DivObserver(int div)

{

m_div = div;

}

void update(int val)

{

cout << val << " div " << m_div

<< " is " << val / m_div << '\n';

}

};

 

class ModObserver

{

int m_mod;

public:

ModObserver(int mod)

{

m_mod = mod;

}

void update(int val)

{

cout << val << " mod " << m_mod

<< " is " << val % m_mod << '\n';

}

};

 

class Subject

{

int m_value;

DivObserver m_div_obj;

ModObserver m_mod_obj;

public:

Subject(): m_div_obj(4), m_mod_obj(3){}

void set_value(int value)

{

m_value = value;

notify();

}

void notify()

{

m_div_obj.update(m_value);

m_mod_obj.update(m_value);

}

};

 

int main()

{

Subject subj;

subj.set_value(14);

}

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

14 div 4 is 3 14 mod 3 is 2

 

Після

Зараз клас Subject не пов’язаний безпосередньо з налаштуваннями числа та типів об’єктів Observer. Клієнт встановив два спостерегача DivObserver та одного ModObserver.

class Observer

{

public:

virtual void update(int value) = 0;

};

 

class Subject

{

int m_value;

vector m_views;

public:

void attach(Observer *obs)

{

m_views.push_back(obs);

}

void set_val(int value)

{

m_value = value;

notify();

}

void notify()

{

for (int i = 0; i < m_views.size(); ++i)

m_views[i]->update(m_value);

}

};

 

class DivObserver: public Observer

{

int m_div;

public:

DivObserver(Subject *model, int div)

{

model->attach(this);

m_div = div;

}

/* virtual */void update(int v)

{

cout << v << " div " << m_div << " is " << v / m_div << '\n';

}

};

 

class ModObserver: public Observer

{

int m_mod;

public:

ModObserver(Subject *model, int mod)

{

model->attach(this);

m_mod = mod;

}

/* virtual */void update(int v)

{

cout << v << " mod " << m_mod << " is " << v % m_mod << '\n';

}

};

 

int main()

{

Subject subj;

DivObserver divObs1(&subj, 4);

DivObserver divObs2(&subj, 3);

ModObserver modObs3(&subj, 3);

subj.set_val(14);

}

 

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

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

 

Питання для самоконтролю:

1. Призначеня патерну Оbserver.

2. Архітектура патерну, діаграма класів, призначення сруктурних сутностей та їх відносини.

3. Реалізація патерну.


 

Лекція №22

Тема: Strategy, його призначення та реалізація у програмах.

Мета: Вивчення патерну Strategy. Навчитися використовувати зазаначений патерн при розробці власних програм.

Перелік питань, що розглядаються на лекції:

1. Призначення патерну Strategy.

2. Опис патерну Strategy.

3. Реалізація патерну Strategy.

4. Результати застосування патерну Strategy.

 


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


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