Инструменты пользователя

Инструменты сайта


pattern_observer

Назад

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

Область применения: шаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами: существует, как минимум, один объект, рассылающий сообщения, имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения. Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают с предоставленной им информацией получатели.

Subject
public interface Subject
{
    void addObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObserver();
}
 
class WeatherData implements Subject
{
    private ArrayList observers;
    private float temp;
    private float humidity;
    private float pressure;
 
    public WeatherData()
    {
        observers = new ArrayList();
    }
 
    public void addObserver(Observer o)
    {
        observers.add(o);
    }
 
    public void removeObserver(Observer o)
    {
        int i = observers.indexOf(o);
        if(i>=0)
            observers.remove(i);
    }
 
    public void notifyObserver()
    {
        for(int i=0;i<observers.size();i++)
        {
            Observer o = (Observer) observers.get(i);
            o.update(temp, humidity, pressure);
        } 
    }
 
    public void setWeather(float temp, float humidity, float pressure)
    {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObserver();
    } 
}
Observer
public interface Observer
{
    public void update(float temp,float humidity,float pressure);
    public void display();
}
 
class AvgDisplay implements Observer
{
    private float temp;
    private float humidity;
    private float pressure;    
    public void update(float temp, float humidity, float pressure)
    {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure; 
        display();
    }
 
    public void display()
    {
        float avg = (temp+humidity+pressure)/3;
        System.out.println("Среднее значения:"+avg);
    }
}
 
class CurrentData implements Observer
{
    private float temp;
    private float humidity;
    private float pressure;
 
    public void update(float temp, float humidity, float pressure)
    {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;       
        display();
    }
 
    public void display()
    {
        System.out.println("Температура:"+temp);
        System.out.println("Влажность:"+humidity);
        System.out.println("Давление:"+pressure);
    }
}
Main
public class Main
{
    public static void main(String[] args)
    {
        WeatherData weatherData = new WeatherData();
        weatherData.addObserver(new CurrentData());
        weatherData.addObserver(new AvgDisplay());
        weatherData.setWeather(22,65,80);
    }
}