Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: Pattern Observer

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168

    Pattern Observer

    Ciao... sto cercando di applicare il pattern Observer ma non riesco a capire a fondo come fare

    Io ho un'applicazione che mi permette di creare delle tabelle. Ciascuna tabella che creo ha uno stato iniziale 'NonModificata'. Sempre dall'applicazione, successivamente, posso modificare questa tabella.
    Prima di salvare le modifiche alla tabella, queste modifiche devono essere accettate.

    Il mio intento è perciò quello di
    - modificare la tabella (cercandola attraverso l'id)
    - salvare le modifiche in maniera provvisoria (per il momento non è questo il mio problema!)
    - cambiare lo stato della tabella in 'Modificata'
    - far comparire al pannello un pulsante che permetta di visualizzare le modifiche
    - una volta accettate o non accettate le modifiche ricambiare lo stato della tabella in 'NonModificata'.

    Qualcuno può aiutarmi per favore??

    Vi posto il codice che sto cercando di scrivere...

    codice:
    package patternObserver;
     
    public class Stato {
           public final static boolean Modificata = false;
           public final static boolean NonModificata = true;
           public boolean code;
           public Object messaggio;
          
           public Stato(boolean code, Object messaggio){
                 this.code = code;
                 this.messaggio = messaggio;
           }
    }
    codice:
    package patternObserver;
     
    public abstract class Observer implements Runnable {
     
           public abstract void update();
    }
    codice:
    package patternObserver;
     
    import patternObserver.Tabella;
     
    import java.util.Observable;
    import java.util.Observer;
     
    public class ConcreteObserver_Tabella implements Observer {
          
           private boolean statoObserver;
     
           protected Tabella tab;
     
           public void setObservable(Tabella observable) {
                 this.tab = observable;
           }
          
           public boolean getStatoObserver(){
                 return this.statoObserver;
           }
          
           @Override
           public void update(Observable o, Object arg){
                 Stato messaggio = (Stato) arg;
                 if (messaggio.code == Stato.Modificata) {
                        System.out.println("La tabella è stata Modificata!!");
                        statoObserver = true;
                 }
                 else if (messaggio.code == Stato.NonModificata) {
                        System.out.println("La tabella non è stata Modificata!");
                        statoObserver = false;     
                 }
           }
    }
    codice:
    package patternObserver;
     
    import patternObserver.Tabella;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public abstract class Observable implements Runnable{
     
           protected Tabella tabella;
     
        private List<Observer> list = new ArrayList<Observer>();
       
        public Observable() {
           tabella = new Tabella();
           creaObserver();
        }
       
        private void creaObserver() {
           ConcreteObserver_Tabella observer = new ConcreteObserver_Tabella();
           tabella.addObserver(observer);
        }
       
        public void addObserver(Observer observer) {
            list.add( observer );
        }
     
        public void removeObserver(Observer observer) {
            list.remove( observer );
        }
     
        public void notificaObservers() {
            for(Observer observer: list) {
                observer.update();
            }
        }
    }
    codice:
    package patternObserver;
     
    import patternObserver.Stato;
     
    import java.util.Observable;
     
    public class Tabella extends Observable {
     
           private Integer idTabella = null;
           private String nome;
           private int numero;
          
           public Tabella(){
                 changedState(new Stato(Stato.NonModificata, null));
                 this.idTabella = 0;
                 this.nome = null;
                 this.numero = 0;
           }
     
           public Tabella(Integer id, String nome, int num) {
                 changedState(new Stato(Stato.NonModificata, null));
                 this.idTabella = id;
                 this.nome = nome;
                 this.numero = num;
           }
     
     
           public void modificaStato() {
                 if(Stato.NonModificata) {
                        changedState(new Stato(Stato.Modificata, null));
                 } else
                        changedState(new Stato(Stato.NonModificata, null));
           }
          
           private void changedState(Stato msg) {
               setChanged();
               notifyObservers(msg);
           } 
          
           public boolean getStato(){
                 if(Stato.Modificata)
                        return true;
                 return false;
           }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    qualcuno che mi aiuti?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Nel metodo changedState della classe Tabella non riesco ad accedere al 'notificaObservers' di Observable creato da me...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non ho letto e valutato bene tutto il tuo codice ma ... una cosa l'ho notata subito: forse non intendevi usare Observable/Observer di java.util (che è una possibile implementazione del pattern "Observer")
    Il punto è che hai definito tuoi tipi chiamati Observable/Observer, che non centrano più nulla con quelli di java.util. Risulta quindi molto fumoso (oltre che quasi sicuramente errato). Inoltre vedo dei implements Runnable ma non vedo i run() (magari non li hai solo postati qui) ma in ogni caso un Observer che implementa di serie Runnable è quanto meno "strano" (dubbio, direi).

    Devi rivedere tutto quanto. O usi Observable/Observer di java.util o la implementazione del pattern "Observer" la fai da zero tu. La implementazione in java.util non è il massimo come design per una serie di aspetti ma ovviamente va bene per certi scenari.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Si in effetti ho cambiato adesso i nomi ad Observer e Observable altrimenti era molto confusionario! Perché come hai ben capito non è mia intenzione usare quelli di java.util!

    Sto cercando di capirci qualcosa, ma a fatica sinceramente!

    Non riesco a capire bene come devo implementare i run...per questo non li ho postati nel codice!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    C'è qualcosa che mi sfugge e mi sta facendo uscire pazza!!!!

    Ma così facendo dove lo memorizzo lo stato della tabella??
    Devo creare una variabile nella classe Tabella?? Ad esempio booleana che modifico true o false a seconda se la tabella è stata modificata o no....
    Oppure lo dovrei memorizzare nel database???

    Nel costruttore della classe Tabella (quindi quando creo una tabella passandogli i parametri) scrivo:
    changedState(
    new Stato(Stato.NonModificata, null));

    quindi imposto lo stato iniziale della tabella a 'NonModificata'.

    Poi però non riesco a capire come leggere lo stato della tabella con un determinato id (cioè ho l'id della tabella e voglio il suo stato)...
    Ultima modifica di Dany_; 01-09-2014 a 20:17

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Oppure devo salvare anche lo stato della tabella nel database?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Dany_ Visualizza il messaggio
    Non riesco a capire bene come devo implementare i run...per questo non li ho postati nel codice!!
    Un "run" (qualunque cosa si potrebbe intendere, es. un "lavoro" da fare), di per sé, non centra proprio nulla con il pattern "Observer"! E comunque se con quei Runnable intendi dire che entra anche in gioco il multi-threading, ovvero ad esempio la registrazione di un observer viene fatta nel contesto del thread X mentre la notifica agli observer viene fatta nel contesto del thread Y, allora devi pure fare un po' di (ri)valutazioni sui soliti aspetti legati alla concorrenza e sincronizzazione.

    Inoltre, lo segnalo solo ora, nel tuo codice iniziale perché la classe Observable dovrebbe creare e tenere un oggetto Tabella che è un Observable? Non ha molto senso ....

    Quote Originariamente inviata da Dany_ Visualizza il messaggio
    Ma così facendo dove lo memorizzo lo stato della tabella??
    Devo creare una variabile nella classe Tabella?? Ad esempio booleana che modifico true o false a seconda se la tabella è stata modificata o no....
    Oppure lo dovrei memorizzare nel database???

    Poi però non riesco a capire come leggere lo stato della tabella con un determinato id (cioè ho l'id della tabella e voglio il suo stato)...

    Oppure devo salvare anche lo stato della tabella nel database?
    Non ho purtroppo ben chiaro in generale cosa vuoi realizzare e quali sono i requisiti, ecc.... ma queste domande che ti stai ponendo riguardano la logica della tua applicazione, vanno "oltre" il pattern Observer.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Io non capisco una cosa:
    - richiamo una prima volta il metodo 'modificaStato' della classe Tabella
    - questo mi cambia lo stato della tabella in 'Modificata' e con notifyObservers mi stampa "La tabella è stata modificata".

    A questo punto, lo stato della tabella non dovrebbe rimanere 'Modificata'?
    Se richiamo una seconda volta 'modificaStato' non dovrebbe stamparmi "La tabella non è stata modificata"?
    A me stampa sempre "La tabella è stata modificata".

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    ps: grazie per i consigli

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.