Observer Pattern

di il
2 risposte

Observer Pattern

Salve a tutti ragazzi!
Sono nuovo e spero di non fare subito danni aprendo questo topic

L'esercizio che sto per postare riguarda la costruzione di una stazione di monitoraggio del tempo basata sul tipo TempoAggiornato che tiene traccia delle condizioni di tempo : Temperatura, Umidità e Pressione.
L'obiettivo è di creare un applicazione che visualizzi in tempo reale: le attuali condizioni, le statistiche sul tempo e una semplice previsione del tempo.

Ora posterò il codice dell'esercizio svolto con le mie domande.

Le Interfacce:

Qual'è la funzione della classe Subject?
public interface Subject 
{
	void registraObserver(Observer o);
	void rimuoviObserver(Observer o);
	void notificaObservers();	
}
public interface Observer 
{
	void update(double temp, double umidita, double press);
}
La classe TempoAggiornato:

Come è possibile istanziare un oggetto della classe Observer?Essendo una interfaccia non si potrebbe o sbaglio? Eppure viene preso come paramentro dai metodi di Subject.
public class TempoAggiornato  implements Subject
{
	private double temperatura;
	private double umidita;
	private double pressione;
	private ArrayList<Observer> observers = new ArrayList<Observer>();

	@Override
	public void registraObserver(Observer o) 
	{
		observers.add(o);
	}

	@Override
	public void rimuoviObserver(Observer o) 
	{
		observers.remove(o);
	}

	@Override
	public void notificaObservers() 
	{
		for (Observer o : observers) o.update(temperatura, umidita, pressione);
	}

}
Classe DisplayCondizioniAttuali:

Non capisco il costruttore della classe e il "(this)" nel costruttore.
public class DispayCondizioniAttuali extends Display implements Observer
{
	private double temperatura;
	private double pressione;
	private double umidita;
	private Subject subject;
	
	public DispayCondizioniAttuali(Subject subject)
	{
		this.subject = subject;
		subject.registraObserver(this);
	}

	@Override
	public void display() 
	{
		System.out.println("Condizioni attuali: temp ="+temperatura+", umidita: ="+umidita+", pressione ="+pressione);
		
	}

	@Override
	public void update(double temp, double umidita, double press) 
	{
		this.temperatura = temp;
		this.umidita = umidita;
		this.pressione = press;
		display();
	}

}
Classe Display:
abstract public class Display 
{
	abstract public void display();
}
In generale ragazzi non capisco la meccanica di questo pattern. Mi servirebbe una illuminazione. Accetto tutto, anche esempi inventati da voi che possano risultarvi più semplici da spiegare.
Vi ringrazio anticipatamente.

2 Risposte

  • Re: Observer Pattern

    groot42 ha scritto:


    Salve a tutti ragazzi!
    Sono nuovo e spero di non fare subito danni aprendo questo topic

    L'esercizio che sto per postare riguarda la costruzione di una stazione di monitoraggio del tempo basata sul tipo TempoAggiornato che tiene traccia delle condizioni di tempo : Temperatura, Umidità e Pressione.
    L'obiettivo è di creare un applicazione che visualizzi in tempo reale: le attuali condizioni, le statistiche sul tempo e una semplice previsione del tempo.

    Ora posterò il codice dell'esercizio svolto con le mie domande.

    Le Interfacce:

    Qual'è la funzione della classe Subject?
    public interface Subject 
    {
    	void registraObserver(Observer o);
    	void rimuoviObserver(Observer o);
    	void notificaObservers();	
    }
    public interface Observer 
    {
    	void update(double temp, double umidita, double press);
    }
    La classe TempoAggiornato:

    Come è possibile istanziare un oggetto della classe Observer?Essendo una interfaccia non si potrebbe o sbaglio? Eppure viene preso come paramentro dai metodi di Subject.
    public class TempoAggiornato  implements Subject
    {
    	private double temperatura;
    	private double umidita;
    	private double pressione;
    	private ArrayList<Observer> observers = new ArrayList<Observer>();
    
    	@Override
    	public void registraObserver(Observer o) 
    	{
    		observers.add(o);
    	}
    
    	@Override
    	public void rimuoviObserver(Observer o) 
    	{
    		observers.remove(o);
    	}
    
    	@Override
    	public void notificaObservers() 
    	{
    		for (Observer o : observers) o.update(temperatura, umidita, pressione);
    	}
    
    }
    Classe DisplayCondizioniAttuali:

    Non capisco il costruttore della classe e il "(this)" nel costruttore.
    public class DispayCondizioniAttuali extends Display implements Observer
    {
    	private double temperatura;
    	private double pressione;
    	private double umidita;
    	private Subject subject;
    	
    	public DispayCondizioniAttuali(Subject subject)
    	{
    		this.subject = subject;
    		subject.registraObserver(this);
    	}
    
    	@Override
    	public void display() 
    	{
    		System.out.println("Condizioni attuali: temp ="+temperatura+", umidita: ="+umidita+", pressione ="+pressione);
    		
    	}
    
    	@Override
    	public void update(double temp, double umidita, double press) 
    	{
    		this.temperatura = temp;
    		this.umidita = umidita;
    		this.pressione = press;
    		display();
    	}
    
    }
    Classe Display:
    abstract public class Display 
    {
    	abstract public void display();
    }
    In generale ragazzi non capisco la meccanica di questo pattern. Mi servirebbe una illuminazione. Accetto tutto, anche esempi inventati da voi che possano risultarvi più semplici da spiegare.
    Vi ringrazio anticipatamente.
    La funzione dell'interfaccia Subject è quella di garantire che la classe che la implementa accetti observers.
    I metodi dell'interfaccia ricevono come argomento un oggetto Observer, accettando quindi l'istanza di una qualsiasi classe che implementi l'interfaccia Observer; infatti in java ogni oggetto può essere considerato un'istanza della classe di base: questo concetto è chiamato upcasting. In questo modo la classe String può essere considerata un tipo Object, e ogni metodo che accetta un Object accetterà una String.
    L'Observer pattern è un modello di programmazione su cui si fonda anche la gestione degli eventi in java. Si basa su un oggetto observer (nel tuo caso un qualsiasi oggetto che implementi Observer) notificato nel caso in cui l'oggetto osservato venga aggiornato (nel tuo caso tramite il metodo notificaObservers() dell'interfaccia Subject).

    La parola chiave this nel costruttore indica il riferimento all'oggetto corrente passato come parametro implicito nel metodo. Quindi, this.nome = nome; assegna al campo d'istanza nome il valore del parametro nome.
  • Re: Observer Pattern

    Ti ringrazio per la risposta anche se in ritardo
    Mi hai chiarito le idee
Devi accedere o registrarti per scrivere nel forum
2 risposte