|
19. Спостерігач — Observer
ADO в Delphi AJAX Android C++ CakePHP CMS COM CSS Delphi Flash Flex HTML Internet Java JavaScript MySQL PHP RIA SCORM Silverlight SQL UML XML Бази даних Веб-розробка Генетичні алгоритми ГІС Гітара Дизайн Економіка Інтелектуальні СДН Колір Масаж Математика Медицина Музика Нечітка логіка ООП Патерни Подання знань Розкрутка сайту, SEO САПР Сесії в PHP Системне програмування Системний аналіз Тестологія Тестування ПЗ Фреймворки Штучний інтелект
|
19. Спостерігач — Observer
Багато людей люблять дивитися бокс. Але окрім цього хтось те все діло фінансує. Левова частка фінансів приходить від реклами та трансляційних дозволів, а також від всяких фанів і азартних гравців, які програють солідні суми, роблячи ставки. Уявімо боксерський бій і двох людей, що роблять ставки — один любить ризиковані ставки, а інший, навпаки, дуже консервативний, і завжди ставить на того, хто, швидше за все, виграє бій. Хто такі ці гравці? Не важко здогадатися, що гравці — це спостерігачі (observer), а бійка, на яку вони ставлять гроші, є суб’єктом споглядання (subject). Вони постійно спостерігають за ходом бійки, щоб змінити свої ставки. Спостерігач дозволяє автоматично реагувати багатьом об’єктам на зміну стану певного іншого об’єкта. Отже, кожен поважаючий себе азартний гравець може оновити свої ставки коли буде потрібно, тому він має метод Update(). Уривок коду 19.1. Спостерігач (Observer) із реалізаціями (RiskyPlayer та ConservativePlayer)
interface IObserver
{
void Update(ISubject subject);
}
class RiskyPlayer : IObserver
{
public string BoxerToPutMoneyOn { get; set; }
public void Update(ISubject subject)
{
var boxFight = (BoxFight)subject;
if (boxFight.BoxerAScore > boxFight.BoxerBScore)
BoxerToPutMoneyOn = "I put on boxer B, if he win I get more!";
else BoxerToPutMoneyOn = "I put on boxer A, if he win I get more!";
Console.WriteLine("RISKYPLAYER:{0}", BoxerToPutMoneyOn);
}
}
class ConservativePlayer : IObserver
{
public string BoxerToPutMoneyOn { get; set; }
public void Update(ISubject subject)
{
var boxFight = (BoxFight)subject;
if (boxFight.BoxerAScore < boxFight.BoxerBScore)
BoxerToPutMoneyOn = "I put on boxer B, better be safe!";
else BoxerToPutMoneyOn = "I put on boxer A, better be safe!";
Console.WriteLine("CONSERVATIVEPLAYER:{0}", BoxerToPutMoneyOn);
}
}
Ось сама гра, яку споглядають наші гравці: Уривок коду 19.2. Те, що споглядають — бій боксерівinterface ISubject { void AttachObserver(IObserver observer); void DetachObserver(IObserver observer); void Notify(); } class BoxFight : ISubject { public List<IObserver> Observers { get; private set; } public int RoundNumber { get; private set; } private Random Random = new Random(); public int BoxerAScore { get; set; } public int BoxerBScore { get; set; } public BoxFight() { Observers = new List<IObserver>(); } public void AttachObserver(IObserver observer) { Observers.Add(observer); } public void DetachObserver(IObserver observer) { Observers.Remove(observer); } public void NextRound() { RoundNumber++; BoxerAScore += Random.Next(0, 5); BoxerBScore += Random.Next(0, 5); Notify(); } public void Notify() { foreach (var observer in Observers) { observer.Update(this); } } } Глянемо на Спостерігача в дії. Для цього створимо боксерський бій, який будуть споглядати гравці (не боксери звісно, бо вони б’ються і своє «бабло» вони «відкосять» у будь-якому випадку): Уривок коду 19.3. Спостерігач в дії
var boxFight = new BoxFight();
var riskyPlayer = new RiskyPlayer();
var conservativePlayer = new ConservativePlayer();
boxFight.AttachObserver(riskyPlayer);
boxFight.AttachObserver(conservativePlayer);
boxFight.NextRound();
boxFight.NextRound();
boxFight.NextRound();
boxFight.NextRound();
А ось вивід на консоль:
RISKYPLAYER:I put on boxer A, if he win I get more!
CONSERVATIVEPLAYER:I put on boxer A, better be safe!
RISKYPLAYER:I put on boxer B, if he win I get more!
CONSERVATIVEPLAYER:I put on boxer A, better be safe!
RISKYPLAYER:I put on boxer B, if he win I get more!
CONSERVATIVEPLAYER:I put on boxer A, better be safe!
RISKYPLAYER:I put on boxer B, if he win I get more!
CONSERVATIVEPLAYER:I put on boxer A, better be safe!
По матеріалам книги Андрія Будая "Дизайн патерни – просто, як двері". Матеріал розміщується за домовленістю з автором.
Зверніть увагу на додаткові посиланняЯкщо вас цікавить...Головний розділСторінки, близькі за змістомзагрузка...
|
Сторінки, близькі за змістом ![]() Шаблони проектування програмного забезпечення (англ. software design patterns) — ефективні способи вирішення задач проектування програмного забезпечення. Шаблон не є закінченим зразком, який можна безпосередньо транслювати в програмний код. Об'єктно-орієнтований шаблон найчастіше є зразком вирішення проблеми і відображає відношення між класами та об'єктами, без вказівки на те, як буде зрештою реалізоване це відношення. |
|
Copyright © 2008—2026 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|