Class ConcreteOutput2 : public StrategyPrint

{ public:

ConcreteOutput2();

~ConcreteOutput2();

void output();

};

#endif

 

// concrete_output2.cpp

#include "header/concrete_output2.h"

 

ConcreteOutput2::ConcreteOutput2()

{ }

 

ConcreteOutput2::~ConcreteOutput2()

{ }

 

Void ConcreteOutput2::output()

{

std::cout << "You choose 2nd strategy\n";

}

// printer.h

 

#ifndef _PRINTER_H_

#define _PRINTER_H_

 

#include <cstdlib>

#include "strategy.h"

 

Class Printer

{ public:

Printer();

~Printer();

 

protected:

StrategyPrint* behavior;

public:

void set_output_method(StrategyPrint* strat);

void print();

};

 

#endif

 

// printer.cpp

#include "header/printer.h"

 

Printer::Printer()

{

behavior = NULL;

}

 

Printer::~Printer()

{

delete behavior;

}

 

void Printer::set_output_method(StrategyPrint* strat)

{

behavior = strat;

}

 

Void Printer::print()

{

behavior->output();

}

Достоинства паттерна Strategy

· Систему проще поддерживать и модифицировать, так как семейство алгоритмов перенесено в отдельную иерархию классов.

· Паттерн Strategy предоставляет возможность замены одного алгоритма другим в процессе выполнения программы.

· Паттерн Strategy позволяет скрыть детали реализации алгоритмов от клиента.

Недостатки паттерна Strategy

· Для правильной настройки системы пользователь должен знать об особенностях всех алгоритмов.

· Число классов в системе, построенной с применением паттерна Strategy, возрастает.

Наблюдатель (Observer)

Наблюдатель — поведенческий шаблон проектирования.

Создает механизм у класса, который позволяет получать экземпляру объекта этого класса оповещения от других объектов об изменении их состояния, тем самым наблюдая за ними.

Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.

При реализации шаблона «наблюдатель» обычно используются следующие классы:

Observable — интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей;

Observer — интерфейс, с помощью которого наблюдатель получает оповещение;

ConcreteObservable — конкретный класс, который реализует интерфейс Observable;

ConcreteObserver — конкретный класс, который реализует интерфейс Observer.

Шаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами:

● существует, как минимум, один объект, рассылающий сообщения;

● имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения;

● нет надобности очень сильно связывать взаимодействующие объекты, что полезно для повторного использования.

Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.

 

Назначение паттерна Observer

· Паттерн Observer определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически.

· Паттерн Observer инкапсулирует главный (независимый) компонент в абстракцию Subject и изменяемые (зависимые) компоненты в иерархию Observer.

· Паттерн Observer определяет часть "View" в модели Model-View-Controller (MVC).

Паттерн Observer находит широкое применение в системах пользовательского интерфейса, в которых данные и их представления ("виды") отделены друг от друга.

При изменении данных должны быть изменены все представления этих данных (например, в виде таблицы, графика и диаграммы).

 

 

Решаемая проблема

Имеется система, состоящая из множества взаимодействующих классов. При этом взаимодействующие объекты должны находиться в согласованных состояниях. Вы хотите избежать монолитности такой системы, сделав классы слабо связанными (или повторно используемыми).

Обсуждение паттерна Observer

Паттерн Observer определяет объект Subject, хранящий данные (модель), а всю функциональность "представлений" делегирует слабосвязанным отдельным объектам Observer.

При создании наблюдатели Observer регистрируются у объекта Subject.

Когда объект Subject изменяется, он извещает об этом всех зарегистрированных наблюдателей.

После этого каждый обозреватель запрашивает у объекта Subject ту часть состояния, которая необходима для отображения данных.

Такая схема позволяет динамически настраивать количество и "типы" представлений объектов.

Описанный выше протокол взаимодействия соответствует модели вытягивания (pull), когда субъект информирует наблюдателей о своем изменении, и каждый наблюдатель ответственен за "вытягивание" у Subject нужных ему данных.

 Существует также модель проталкивания, когда субъект Subject посылает ("проталкивает") наблюдателям детальную информацию о своем изменении.

Паттерн Observer впервые был применен в архитектуре Model-View-Controller языка Smalltalk, представляющей каркас для построения пользовательских интерфейсов.

Структура паттерна Observer

Subject представляет главную (независимую) абстракцию. Observer представляет изменяемую (зависимую) абстракцию.

Субъект извещает наблюдателей о своем изменении, на что каждый наблюдатель может запросить состояние субъекта.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: