Un saluto a tutti.
Studio Java da poco e sto affrontando l'argomento Pattern sia MVC che Observer.
Vorrei proporre un quesito più che un problema.
Il model (Observable) informa la View (Observer) che c'è stato un cambiamento.
La view, nel suo metodo update, può sapere quale variabile del model è cambiata ed
aggiornare solo la label interessata? Magari senza usare IF o SWITCH ma usando il
polimorfismo?
Mi spiego meglio.
Nel mio lavoro ho a che fare con dei Sili che contengono dei materiali ed allora ho
buttato giù questo model:
codice:
package observerexample4;
import java.util.Observable;

public class SiloModel extends Observable {
    private Integer numero;    
    private String  materiale;
    private Integer peso;
    
    public SiloModel(Integer numero, String materiale, Integer peso){
        setNumero(numero);
        setMateriale(materiale);
        setPeso(peso);
    }
    public void setNumero(Integer numero){
        this.numero=numero;
        setChanged();
        notifyObservers();
    }
    public void setMateriale(String materiale){
        this.materiale=materiale;
        setChanged();
        notifyObservers();
    }
    public void setPeso(Integer peso){
        this.peso=peso;
        setChanged();
        notifyObservers();
    }
    public Integer getNumero(){return this.numero;}
    public String getMateriale(){return this.materiale;}
    public Integer getPeso(){return this.peso;}
}
Faccio notare che il numero del silo è un dato che non cambia quasi mai, viene impostato
all'inizio e rimane sempre quello. Il materiale può cambiare quando il silo si svuota e può
essere riempito con un altro tipo di materiale. Il peso invece è un dato che cambia molto
frequentemente quando il silo è in fase di carico/scarico.
Quindi le variabili del model possono essere molte e con frequenza di aggiornamento diverse.
Passiamo alla View:
codice:
package observerexample4;

import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;
import java.util.Observer;

public class SiloView implements Observer {
    private Frame frame=new Frame();
    private Label materiale=new Label();
    private Label peso=new Label();
    private SiloModel model;
    
    public SiloView(SiloModel m){
        model=m;
        model.addObserver(this); // mi registro come osservatore
        
        Panel p1 = new  Panel();
        p1.add(materiale);
        p1.add(peso);
        
       // preparazione della view
        materiale.setText(model.getMateriale());
        peso.setText("" + model.getPeso());
        peso.setAlignment(Label.CENTER);
        
        frame.setTitle("Silo " + model.getNumero());
        frame.setSize(300,60);
        frame.setLocation(100,100);
        frame.add(p1);

        frame.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing (WindowEvent ev){
                frame.setVisible(false);
            }
        });
        this.frame.setVisible(true);
    }
    public void update(Observable o, Object arg) {
        peso.setText(""+model.getPeso());
        materiale.setText(model.getMateriale());
    }
}
Nel metodo update aggiorno tutte le label con i dati del model e nella maggior
parte dei casi non è necessario aggiornare tutto.
E qui riformulo la domanda:
Nel metodo update, posso sapere se è cambiato solo il materiale (aggiorno tutto)
o è cambiato solo il peso (aggiorno solo il peso)?
Magari senza usare if (è cambiato peso){fai questo} else {fai quest'altro} ma
usando una soluzione 'elegante' come il Polimorfismo?

Scusate la lungaggine e vi ringrazio anticipatamente