- •Вступление
- •Порождающие шаблоны проектирования
- •Использование
- •Перечень порождающих шаблонов
- •Абстрактная фабрика — Абстрактная фабрика
- •Цель
- •Плюсы
- •Минусы
- •Применимость
- •Структура
- •Пример реализации
- •Builder — Строитель
- •Цель
- •Плюсы
- •Применение
- •Структура
- •Пример реализации
- •Factory method — Фабричный метод
- •Цель
- •Структура
- •Плюсы
- •Минусы
- •Пример реализации
- •Lazy initialization — Ленивая инициализация
- •Достоинства
- •Недостатки
- •Пример реализации
- •Object pool — Объектный пул
- •Применение
- •Переполнение
- •Примеры
- •Ловушки
- •Пример реализации
- •Prototype — Прототип
- •Назначение
- •Применимость
- •Структура
- •Пример реализации
- •Singleton — Одиночка
- •Цель
- •Плюсы
- •Минусы
- •Применение
- •Структура
- •Пример реализации
- •Double checked locking - Блокировка с двойной проверкой
- •Пример реализации
- •Структурные шаблоны проектирования
- •Использование
- •Перечень структурных шаблонов
- •Front Controller — Входная точка
- •Пример
- •Структура
- •Adapter — Адаптер
- •Задача
- •Способ решения
- •Участники
- •Структура
- •Следствия
- •Реализация
- •Пример реализации
- •Bridge — Мост
- •Цель
- •Структура
- •Описание
- •Использование
- •Пример реализации
- •Composite — Компоновщик
- •Цель
- •Структура
- •Пример реализации
- •Decorator — Декоратор
- •Задача
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Замечания и комментарии
- •Применение шаблона
- •Структура
- •Пример реализации
- •Facade — Фасад
- •Структура
- •Проблема
- •Решение
- •Особенности применения
- •Пример реализации
- •Flyweight — Приспособленец
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Proxy — Заместитель
- •Проблема
- •Решение
- •Структура
- •Преимущества
- •Недостатки
- •Сфера применения
- •Прокси и близкие к нему шаблоны
- •Пример реализации
- •Поведенческие шаблоны проектирования
- •Использование
- •Перечень поведенческий шаблонов
- •Chain of responsibility — Цепочка обязанностей
- •Применение
- •Сруктура
- •Пример реализации
- •Command — Команда
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Interpreter — Интерпретатор
- •Проблема
- •Решение
- •Преимущества
- •Недостатки
- •Пример
- •Структура
- •Пример реализации
- •Iterator — Итератор
- •Структура
- •Пример реализации
- •Mediator — Посредник
- •Проблема
- •Решение
- •Преимущества
- •Структура
- •Описание
- •Пример реализации
- •Memento — Хранитель
- •Применение
- •Структура
- •Описание
- •Пример реализации
- •Observer — Наблюдатель
- •Назначение
- •Структура
- •Область применения
- •Пример реализации
- •State — Состояние
- •Структура
- •Пример реализации
- •Strategy — Стратегия
- •Задача
- •Мотивы
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Полезные сведения
- •Использование
- •Сруктура
- •Пример реализации
- •Template — Шаблонный метод
- •Применимость
- •Участники
- •Сруктура
- •Пример реализации
- •Visitor — Посетитель
- •Структура
- •Описание средствами псевдокода
- •Проблема
- •Решение
- •Рекомендации
- •Преимущества
- •Недостатки
- •Пример реализации
- •Null Object (Null object)
- •Мотивация
- •Описание
- •Структура
- •Реализация
- •Пример
- •Связь с другими патернами
- •Критика и комментарии
- •Пример реализации
- •Слуга (Servant)
- •Описание
- •Структура
- •Реализаци
- •Пример реализации
- •Specification (Specification)
- •Структура
- •Пример реализации
- •Пример использования
- •Simple Policy
- •Обзор
- •Простыми словами
- •Сруктура
- •Пример реализации
- •Single-serving visitor
- •Применение
- •Пример использования
- •Плюси
- •Минусы
- •Пример реализации
- •Об авторе
Observer — Наблюдатель
Наблюдатель, Observer — поведенческий шаблон проектирования. Также известен как «подчинённые»
(Dependents), «издатель-подписчик» (Publisher-Subscriber).
Назначение
Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.
Структура
При реализации шаблона «наблюдатель» обычно используются следующие классы.
Observable — интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей.
Observer — интерфейс, с помощью которого наблюдатель получает оповещение.
ConcreteObservable — конкретный класс, который реализует интерфейс Observable.
ConcreteObserver — конкретный класс, который реализует интерфейс Observer.
Область применения
Шаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами:
-существует, как минимум, один объект, рассылающий сообщения
-имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения.
-нет надобности очень сильно связывать взаимодействующие объекты, что полезно для повторного использования.
Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.
89
Пример реализации using System;
namespace Observer
{
///<summary>
///Observer Pattern Judith Bishop Jan 2007
///The Subject runs in a thread and changes its state
///independently. At each change, it notifies its Observers.
///</summary>
class Program
{
static void Main(string[] args)
{
Subject subject = new Subject();
Observer Observer = new Observer(subject, "Center", "\t\t"); Observer observer2 = new Observer(subject, "Right", "\t\t\t\t"); subject.Go();
// Wait for user Console.Read();
}
}
class Simulator : IEnumerable
{
string[] moves = { "5", "3", "1", "6", "7" };
public IEnumerator GetEnumerator()
{
foreach (string element in moves) yield return element;
}
}
class Subject
{
public delegate void Callback(string s);
public event Callback Notify;
Simulator simulator = new Simulator();
const int speed = 200;
public string SubjectState
{
get; set;
}
public void Go()
{
new Thread(new ThreadStart(Run)).Start();
}
void Run()
{
foreach (string s in simulator)
{
Console.WriteLine("Subject: " + s); SubjectState = s;
90
Notify(s);
Thread.Sleep(speed); // milliseconds
}
}
}
interface IObserver
{
void Update(string state);
}
class Observer : IObserver
{
string name;
Subject subject;
string state;
string gap;
public Observer(Subject subject, string name, string gap)
{
this.subject = subject; this.name = name; this.gap = gap; subject.Notify += Update;
}
public void Update(string subjectState)
{
state = subjectState;
Console.WriteLine(gap + name + ": " + state);
}
}
}
91
