→ Пошук по сайту       Увійти / Зареєструватися
Знання Патерни Патерни поведінки — Behavioral patterns

19. Спостерігач — Observer

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!

По матеріалам книги Андрія Будая "Дизайн патерни – просто, як двері". Матеріал розміщується за домовленістю з автором.
Робота представлена за умовами ліцензії Creative Commons Attribution-NonCommercial 3.0 Unported License.

загрузка...
Сторінки, близькі за змістом