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:
Faccio notare che il numero del silo è un dato che non cambia quasi mai, viene impostatocodice: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;} }
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:
Nel metodo update aggiorno tutte le label con i dati del model e nella maggiorcodice: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()); } }
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

Rispondi quotando