Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-05-2010, 11:56   #1
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
[Java] Realizzare il pattern Observer

Ciao,
stò studiando i pattern applicati a Java.
Attualmente mi stò vedendo il pattern Observer che viene usato praticamente in tutte le GUI.

Mi dite se ho capito bene?

Allora io ho sostanzialmente ho due tipi di oggetti:
1) Un SOGGETTO (o publisher) che di fatto rappresenta i miei dati.
2) Vari OBSERVER (o listener) che di fatto rappresentano una specifica vista dei mie dati (mantenendosi sincronicatti con il soggetto)

La logica che ci stà dietro è la seguente: Il soggetto rappresenta i miei dati e si manterrà una lista di tutti gli osservatori che lo stanno osservando (che vogliono quindi rappresentare i dati e le loro modifiche quando esse avvengono).
Quando i dati subiscono una modifica il soggetto invia una notifica a tutti i suoi osservatori che si auto aggiorneranno e forniranno una nuova vista dei dati.

(Es: ho un foglio di excell. I dati nel sistema sono il soggetto. La rappresentazione è l'osservatore. Tramite l'osservatore modifico il valore di una cella. Il soggetto ricalcola con una formula i valori di tutte le altre celle del foglio di calcolo che vengono così modificate, così avverte l'osservatore della modifica, esso si aggiorna e visualizza i nuovi valori di tutte le celle)

Esempio in codice:

Observer la dichiaro come un'interfaccia, poi ovviamente devo implementarla ed in base al tipo concreto dell'Observer il metodo update aggiornerà la vista o farà qualcosa in uno specifico modo:

Codice:
/* Interfaccia che rappresenta i vari oggetti osservatori che a loro volta
 * rappresentano una specifica rappresentazione dei dati
 */

public interface Observer {
  public void update(Subject subject) ;	// Metodo astratto che modifica i dati
}
Subject:

Codice:
import java.util.Vector;

/* Classe che rappresenta i dati su cui si basano le viste */

public class Subject{
	
  /* Crea un vettore che conterrà la lista di tutti gli osservatori che lo
   * osservano */
  protected Vector observers = new Vector();

  public void addObserver(Observer o){  // Aggiunge un oggetto Observer al vettore  
    observers.addElement(o);
  }

  public void removeObserver(Observer o){ // Rimuove un osservatore dal vettore
    observers.removeElement(o);
  }
  
  /* Notifica agli oggetti osservatori che c'è stata una modifica dei dati
   * rappresentati da Subject */
  public void notify(){			
    Enumeration e = observers.getElements();

    while (e.hasMoreElements()) {
      /* Invoca il metodo update su tutti gli osservatori per modificare le viste */
      ((Observer)e.nextElement()).update(this);
    }
  }
}
mmm...il mio ragionamento è corretto?

Grazie
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2010, 12:42   #2
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Il pattern observer, realizza il relazionamento 1-molti tra il subject ed n ascoltatori, in modo che ogni variazione di stato dell' observable sia ascoltata in broadcast dagli observer. Ovviamente tale logica trova un' applicazione nello slegare i dati applicativi dalla loro rappresentazione. Ad esempio 2 observer potrebbero consumare i dati: uno per mostrarli a video e l' altro per loggarli su file o mandarli in rete.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2010, 17:03   #3
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
Ti ringrazio,
mmm...ora però ho un altro problemino con un altro esempio più concreto che non mi gira (purtroppo sono tremendamente arrugginito con Java e diciamo che non ci ho mai fatto nulla di che)

L'esempio è questo:

INTERFRACCIA Observer:
Codice:
/* Rappresenta un generico oggetto osservatore  */

public interface Observer {
       void update();
}
CLASSE ConcreteObserver:
Codice:
/* Implementa l'interfaccia Observer e rappresenta uno specifico tipo di oggetto
 * osservatore */

public class ConcreteObserver implements Observer{
       
	// Specifica quale suggetto stà osservando l'oggetto osservatore
	private ConcreteSubject subject;	
       
	/* COSTRUTTORE: crea uno specifico osservatore e gli passa il riferimento
	 * all'oggetto soggetto che si intende osservare */
	public ConcreteObserver(ConcreteSubject aSubject){
		subject = aSubject;
        subject.add(this);
    }
	
	/* Metodo pubblico che viene invocato dal soggetto per modificare lo stato
	 * dell'osservatore quando nel soggetto avviene una modifica */
    public void update(){
    	System.out.println("Io sono l'observer " + this + 
    			" ed il nuovo stato del mio subject e' " + subject.getState());
    }
    
}
INTERFACCIA Subject:
Codice:
/* Interfaccia che rappresenta un generico soggetto che rappresenta i dati */

public interface Subject {
       void add(Observer anObserver);	// Aggiunge un elemento lista degli osservatori
       void remove(Observer anObserver);	// Rimuove un elemento dalla lista degli osservatori
       void notify(); // Notifica a tutti gli oggetti osservatori una modifica sui dati
}
CLASSE ConcreteSubject (che contiene anche il metodo main() ):
Codice:
import java.util.LinkedList;

/* Rappresenta un tipo concreto di Subject ed implementa l'interfaccia Subject */

public class ConcreteSubject implements Subject {
       
	private int state;	// Rappresenta lo stato del soggetto (il dato rappresentato)
       
    
    private LinkedList observers;	// Rappresenta la lista degli osservatori
       
    /* Creatore: Crea un oggetto di tipo ConcreteSubject e riceve come input il
     * dato che si intende rappresentare (lo stato iniziale del soggetto) */
    public ConcreteSubject(int initialState){
       state = initialState;				// Setta lo stato
       }
    
    /* Metodo pubblico che restituisce al chiamante il valore dello stato del 
     * soggetto */
    public int getState(){
        return state;
    }
    
    /* Metodo pubblico che permette la modifica dello stato del soggetto */
    public void setState(int aState) {
        state = aState;
    }
    
    /* Metodo pubblico che permette di inserire un oggetto osservatore nella lista
     * di ogetti che osservano il soggetto */
    public void add(Observer anObserver) {
        observers.add(anObserver);
    }
    
    /* Metodo pubblico che permette di rimuovede un oggetto osservatore dalla lista
     * di ogetti che osservano il soggetto */
    public void remove(Observer anObserver) {
        observers.remove(anObserver);
    }
    
    /* Metodo pubblico che notifica agli oggetti osservatori eventuali modifiche
     * dei dati nel soggetto */
    public void notify(){
        Iterator iter=observers.iterator();	// Crea un iteratore su observer
        Observer obs;			// Contiene il riferimento ad un generico Observer
        while(iter.hasNext()){	// Aggiorna tutti gli observer
                obs=(Observer)iter.next();
                obs.update();
        }
        
    /* Metodo main() che avvia l'applicazione: prende in input un array di
     * argomenti */
    public static void main(String[] args){
        
    	// Crea un array di osservatori di 3 locazioni 
    	int concreteObservers[3];
    	int initialState = 10;		// Setta a 10 la variabile initialState
        
    	// Crea un nuovo soggetto concreto passandogli uno stato iniziale
    	ConcreteSubject mySubject = new ConcreteSubject(initialState);
    	// Stampa lo stato del soggetto appena creato
        System.out.println("E' stato creato un subject con stato " +
        mySubject.getState());
        
        /* Crea tre oggetti osservatori e mette il loro riferimento nell'array
         * concreteObservers */
        for (int i = 0; i < 3; i++){
        	concreteObservers[i] = new ConcreteObserver(mySubject);
        }
        
        System.out.println("..."); 
        mySubject.setState(17);		// Cambia il valore dello stato del soggetto
        mySubject.notify(); // Notifica il cambiamento di stato agli oggetti osservatori
        System.out.println("...");
        mySubject.setState(06);		// Cambia il valore dello stato del soggetto
        mySubject.notify();  // Notifica il cambiamento di stato agli oggetti osservatori
    }

}
Praticamente eclipse mi segnala una sorta di warning: "Cannot override the final method from Object" alla linea:
void notify(); di Subject (forse c'entra con quella cosa che mi dicevi prima?)

E poi mi dà una serie di errori dentro la classe ConcreteSubject.

Gli errori che mi dà sono:


Cannot override the final method from Object ConcreteSubject.java /Observer3/src line 43 Java Problem
Iterator cannot be resolved to a type ConcreteSubject.java /Observer3/src line 44 Java Problem
Syntax error on token "3", delete this token ConcreteSubject.java /Observer3/src line 56 Java Problem
Syntax error, insert "}" to complete Block ConcreteSubject.java /Observer3/src line 48 Java Problem
Type mismatch: cannot convert from ConcreteObserver to int ConcreteSubject.java /Observer3/src line 68 Java Problem
LinkedList is a raw type. References to generic type LinkedList<E> should be parameterized ConcreteSubject.java /Observer3/src line 10 Java Problem
Type safety: The method add(Object) belongs to the raw type LinkedList. References to generic type LinkedList<E> should be parameterized ConcreteSubject.java /Observer3/src line 32 Java Problem

Non capisco...l'esempio è prefetto...preso dal sito di un corso universitario...booo
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2010, 17:35   #4
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Chiamalo notifica, notify e' un metodo di object che viene ereditato, e tu cosi' tenti di sovrascriverlo..
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2010, 19:36   #5
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
Quote:
Originariamente inviato da Darecon Guarda i messaggi
Chiamalo notifica, notify e' un metodo di object che viene ereditato, e tu cosi' tenti di sovrascriverlo..
Vero :-)
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Grazie a GLIMPSE-17775 il telescopio spa...
Samsung Galaxy A27 5G è ufficiale...
TCL aggiorna la sua gamma di monitor per...
Anche OPPO avrà uno smartphone co...
La Radeon RX 9070 XT appare su Steam e m...
L'America si ribella ai datacenter: bloc...
'Artificial General Engineer': l'IA di J...
Il drone NASA Dragonfly, che voler&agrav...
Stop immediato a Fable 5 e Mythos 5: il ...
"Prime Day Amazon il 23-26 giugno": sì e...
Oggi 2 super MacBook Pro M5 e M5 Pro, 24...
Tineco Floor One Station S9 Artist: il s...
Raggiunte nuove altitudine e velocit&agr...
Apple Watch Series 11 GPS a 339€ su Amaz...
Come un MacBook, ma con la RTX 5070: MSI...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v