Рубрики

Наблюдатель Pattern | Набор 2 (реализация)

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

Наблюдатель Pattern-Введение

В наборе 1 мы обсуждали ниже проблему, решение проблемы без шаблона Observer и проблемы с решением.

Предположим, мы создаем приложение для игры в крикет, которое уведомляет зрителей о такой информации, как текущий счет, скорость бега и т. Д. Предположим, что мы создали два элемента отображения CurrentScoreDisplay и AverageScoreDisplay. CricketData имеет все данные (прогоны, миски и т. Д.), И каждый раз, когда данные изменяются, элементы дисплея уведомляются с новыми данными, и они отображают последние данные соответственно

Применение шаблона Observer к вышеуказанной проблеме:
Давайте посмотрим, как мы можем улучшить дизайн нашего приложения, используя шаблон наблюдателя. Если мы наблюдаем поток данных, мы можем легко увидеть, что элементы CricketData и display следуют отношениям субъекта-наблюдателя.

Диаграмма нового класса:

Реализация Java:

// Java-программа для демонстрации работы
// шаблон сервера

import java.util.ArrayList;

import java.util.Iterator;

  
// Реализованы данные по крикету для общения
// с наблюдателями

interface Subject

{

    public void registerObserver(Observer o);

    public void unregisterObserver(Observer o);

    public void notifyObservers();

}

  

class CricketData implements Subject

{

    int runs;

    int wickets;

    float overs;

    ArrayList<Observer> observerList;

  

    public CricketData() {

        observerList = new ArrayList<Observer>();

    }

  

    @Override

    public void registerObserver(Observer o) {

        observerList.add(o);

    }

  

    @Override

    public void unregisterObserver(Observer o) {

        observerList.remove(observerList.indexOf(o));

    }

  

    @Override

    public void notifyObservers()

    {

        for (Iterator<Observer> it =

              observerList.iterator(); it.hasNext();)

        {

            Observer o = it.next();

            o.update(runs,wickets,overs);

        }

    }

  

    // получить последние пробеги со стадиона

    private int getLatestRuns()

    {

        // возвращаем 90 для простоты

        return 90;

    }

  

    // получить последние калитки со стадиона

    private int getLatestWickets()

    {

        // возвращаем 2 для простоты

        return 2;

    }

  

    // получить последние кадры со стадиона

    private float getLatestOvers()

    {

        // возвращаем 90 для простоты

        return (float)10.2;

    }

  

    // Этот метод используется для обновления отображений

    // когда данные меняются

    public void dataChanged()

    {

        // получить последние данные

        runs = getLatestRuns();

        wickets = getLatestWickets();

        overs = getLatestOvers();

  

        notifyObservers();

    }

}

  
// Этот интерфейс реализован всеми
// классы, которые должны обновляться всякий раз, когда
// это обновление от CricketData

interface Observer

{

    public void update(int runs, int wickets,

                      float overs);

}

  

class AverageScoreDisplay implements Observer

{

    private float runRate;

    private int predictedScore;

  

    public void update(int runs, int wickets,

                       float overs)

    {

        this.runRate =(float)runs/overs;

        this.predictedScore = (int)(this.runRate * 50);

        display();

    }

  

    public void display()

    {

        System.out.println("\nAverage Score Display: \n"

                           + "Run Rate: " + runRate +

                           "\nPredictedScore: " +

                           predictedScore);

    }

}

  

class CurrentScoreDisplay implements Observer

{

    private int runs, wickets;

    private float overs;

  

    public void update(int runs, int wickets,

                       float overs)

    {

        this.runs = runs;

        this.wickets = wickets;

        this.overs = overs;

        display();

    }

  

    public void display()

    {

        System.out.println("\nCurrent Score Display:\n"

                           + "Runs: " + runs +

                           "\nWickets:" + wickets +

                           "\nOvers: " + overs );

    }

}

  
// Класс водителя

class Main

{

    public static void main(String args[])

    {

        // создаем объекты для тестирования

        AverageScoreDisplay averageScoreDisplay =

                          new AverageScoreDisplay();

        CurrentScoreDisplay currentScoreDisplay =

                          new CurrentScoreDisplay();

  

        // передать данные в данные по крикету

        CricketData cricketData = new CricketData();

  

        // регистрируем элементы отображения

        cricketData.registerObserver(averageScoreDisplay);

        cricketData.registerObserver(currentScoreDisplay);

  

        // в реальном приложении у вас есть логика

        // вызываем эту функцию при изменении данных

        cricketData.dataChanged();

  

        // удалить наблюдателя

        cricketData.unregisterObserver(averageScoreDisplay);

  

        // теперь только currentScoreDisplay получает

        // уведомление

        cricketData.dataChanged();

    }

}

Выход:

 Отображение среднего балла: 
Скорость выполнения: 8,823529
ПрогнозируемоеScore: 441

Отображение текущей оценки:
Работает: 90
Калитки: 2
Overs: 10,2

Отображение текущей оценки:
Работает: 90
Калитки: 2
Overs: 10,2

Примечание: теперь мы можем добавлять / удалять столько наблюдателей, не меняя тему.

Ссылки:

  1. https://en.wikipedia.org/wiki/Observer_pattern
  2. Книга Head First Design Patterns (настоятельно рекомендуется)

Эта статья предоставлена Сулабх Кумар . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Наблюдатель Pattern | Набор 2 (реализация)

0.00 (0%) 0 votes