tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1293
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    H3llGhost H3llGhost ist offline Mitglied Bronze
    Registriert seit
    Jun 2006
    Beiträge
    45
    Hallo Leute,

    ich habe von Wikipedia den Artikel zum Observer gelesen. (Link: Observer (Entwurfsmuster) ? Wikipedia)
    Ich habe dementsprechend auch mein Interface Observable geschrieben, die Klasse ObservableSupport und meine Klasse mit einem implements erweitert.
    Mein Problem ist nun, dass ich nicht weiß wie ich mit folgendem Aufruf weiterarbeiten kann:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
        public void update(Observable arg0, Object arg1) {
            System.out.println(arg0);
            System.out.println(arg1);
    //      if ((arg0 == this.s || arg0 == this.fs) && "gui".equals(arg1)){
    //          if (arg0 == this.s) {
    //              if(this.s.getProperty().startsWith("Client-"))
    //                  this.clientEvent(this.s.getProperty());
    //              else
    //                  this.writeLog(this.s.getProperty());
    //          } else if (arg0 == this.fs) {
    //              if(this.fs.getProperty().startsWith("Client-"))
    //                  this.clientEvent(this.fs.getProperty());
    //              else
    //                  this.writeLog(this.fs.getProperty());
    //          }
    //      }
        }

    Als Kommentar sieht man mein altes Handling, dies ist nun nicht mehr funktionstüchtig, da ich nun das Interface benutze.

    Habt ihr eventuell ne Idee wie ich damit weiterarbeiten kann?
    Als Hinweis die Ausgabe von arg0 und arg1 ergibt folgendes:

    observer.ObservableSupport@e2291
    gui
    Vielen Dank im Vorraus.
     

  2. #2
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Huch, keine Delegates? Ach ja, das ist ja Java

    Mit dem Interface weiterarbeiten geht, der Code müsstest zuerst prüfen, welches Subjekt die Nachricht gesendet hat, und dann entsprechend dem Grund geeignet reagieren.
    Wenn ObservableSupport eine Hilfsklasse ist, die von einem Subjekt gehalten wird (also Delegation statt Vererbung), dann muss die Identifikation anders hergestellt werden;
    der ObservableSupport könnte z.B. das Subjekt wissen, an dem dieser hängt.
    Eine andere Möglichkeit bestünde darin, dass der mitgelieferte Änderungsgrund Rückschlüsse auf das Subjekt erlaubt ... das bereitet aber früher oder später garantiert Ärger

    Das Observable selber als Argument macht nur Sinn, wenn erwartet wird, dass es Beobachter gibt, die mehrere Subjekte gleichzeitig beobachten.
    Wenn dem nicht so ist, würde eine #Update() Methode reichen, die evtl. noch den Grund des Aufrufes mitliefert -- in welcher Form auch immer.
    Strings sind halt hübsch allgemein, aber da kann man sich ganz schnell ganz fies ins Knie schießen mit.
     

  3. #3
    H3llGhost H3llGhost ist offline Mitglied Bronze
    Registriert seit
    Jun 2006
    Beiträge
    45
    Ich habe mir das alles mal über das Wochenende angeschaut, aber wenn ich ehrlich bin ich habe es nicht geschafft.

    Kannst du mir eventuell noch einen Tipp geben?
     

  4. #4
    RoCMe RoCMe ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    193
    Hi!

    Ich habe dementsprechend auch mein Interface Observable geschrieben, die Klasse ObservableSupport und meine Klasse mit einem implements erweitert.
    Hm, hast du wirklich ein eigenes Interface Observable geschrieben, oder hast du das von Java genutzt? Und wer ist ObservableSupport?

    "meine Klasse" und ObservableSupport implementieren das Interface "Observable"?

    Ich hab das Gefühl, ich versteh nicht so ganz, wo dein Problem liegt... Ich schlage als Lösung einfach mal einen cast vor, ohne genau zu wissen, ob dir das hilft

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public void update(Observable arg0, Object arg1) {
            System.out.println(arg0);
            System.out.println(arg1);
            if (arg0 instanceof WAS_AUCH_IMMER.class) {
                WAS_AUCH_IMMER myDingsDa = (WAS_AUCH_IMMER) arg0;
                if (myDingsDa.getProperty().startsWith("Client-"))
                        this.clientEvent(myDingsDa.getProperty());
                else
                      this.writeLog(myDingsDa.getProperty());
           }
    }

    In der Annahme, dass this.s und this.fs entweder Instanzen der gleichen Klasse sind oder zumindest die Methode getProperty() von der gleichen Superklasse erben, kannst du im obigen Codebeispiel "WAS_AUCH_IMMER" durch die entsprechende Klassenbezeichnung ersetzen.

    Hoffe, das löst dein Problem

    Gruß,

    RoCMe
    [/code]
     

  5. #5
    H3llGhost H3llGhost ist offline Mitglied Bronze
    Registriert seit
    Jun 2006
    Beiträge
    45
    Meinen Code habe ich aus dem Wikipedia Artikel aus dem ersten Post.

    Ich poste ihn hier aber nochmal:

    ObservableSupport
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    import java.util.Observable;
     
    public class ObservableSupport extends Observable {
        public ObservableSupport() {
        }
        public void markAndNotify(Object o){
            setChanged();
            notifyObservers(o);
        }
    }

    Observable
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    import java.util.Observer;
     
    public interface Observable {
        void addObserver(Observer o);
        void deleteObserver(Observer o);
        void deleteObservers();
        boolean hasChanged();
        int countObservers();
    }
     

  6. #6
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Vergiss den Code mit dem ObservableSupport. Das ist Schrott; interfaces werden implementiert, und der Code ist unvollständig.
    Außerdem ist das ist einfach der Versuch, den PropertyChangeListener nachzubauen.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    public class Subjekt {
     
        public static final String VALUE_CHANGED = "Subjekt_value";
        
        public Subjekt () {
            m_value = 100;
            m_pcs = new PropertyChangeSupport(this);
        }
        
        public void change() {
            int oldValue = m_value;
            m_value --;
            m_pcs.firePropertyChange(VALUE_CHANGED, oldValue, m_value);
        }
        
        public void AddListener(PropertyChangeListener l) {
            m_pcs.addPropertyChangeListener(l);
        }
        
        public void RemoveListener(PropertyChangeListener l) {
            m_pcs.removePropertyChangeListener(l);
        }
        
        private int m_value;
        
        private PropertyChangeSupport m_pcs;
        
    }
     
    public class Beobachter implements PropertyChangeListener {
        
        public Beobachter(Subjekt s) {
            m_subjekt = s;
        }
        
        public static void main(String[] args) {
            Subjekt s = new Subjekt();
            Beobachter b = new Beobachter(s);
            b.attach();
            s.change();
            b.detach();
        }
        
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if(Subjekt.VALUE_CHANGED.equals(evt.getPropertyName())) {
                System.out.println("Value changed from " + evt.getOldValue() + " to " + evt.getNewValue());
            }
        }
        
        public void attach() {
            m_subjekt.AddListener(this);
        }
        
        public void detach() {
            m_subjekt.RemoveListener(this);
        }
        
        private Subjekt m_subjekt;
     
    }

    Der Code muss da garnix rumcasten, denn es ist ja bekannt, wer den property change gefeuert hat.
    Jetzt ist hier aber nur eine Subjekt-Instanz. Wenn es davon mehrere gibt, ist erstmal nicht bekannt, welche Subjekt-Instanz gefeuert hat - dafür gibts dann die Methode #getSource() am PropertyChangeEvent.

    Variationsmöglichkeiten:
    • Der Beobachter muss PropertyChangeListener nicht implementieren, er könnte auch eine anonyme Klasse dafür verwenden.
    • Der Beobachter muss nicht auf alle property changed events des Subjekts hören.
    • Man könnte noch etwas mit Generics spielen, damit beim property change die Instanz mit ihrem statischen Typ übergeben wird, und nicht bloß als Object.
    • ... und sicher noch vieles anderes ...

    Hock Dich mal mitm Debugger in die main() und step durch.
     

Ähnliche Themen

  1. Observer Pattern
    Von chuvak im Forum Java Grundlagen
    Antworten: 6
    Letzter Beitrag: 13.08.10, 13:06
  2. Hooks, Aspects und Observer
    Von ZodiacXP im Forum Coders Talk
    Antworten: 0
    Letzter Beitrag: 10.05.10, 14:43
  3. Observer Pattern
    Von tsluga im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 28.04.10, 16:05
  4. Observer-Muster
    Von DerMauri im Forum Java
    Antworten: 12
    Letzter Beitrag: 04.09.07, 15:24
  5. Verständnisfrage zu Observer/Observable
    Von Katfani im Forum Java
    Antworten: 8
    Letzter Beitrag: 23.05.07, 19:22