Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: So 06.03.11 20:43 
Habe eine Netzwerkanwendung, die Packete empfängt, verarbeitet und sendet. Da die Packete eine bestimmte Struktur haben, geschiet das Empfangen in einer Klasse, die auch die Trennung in Opcode und Daten übernimmt.
Jetzt habe ich das als Observable implementiert, sodass sich Parserklassen mit ihren Funktionen auf bestimmte Opcodes registrieren können.
Also kriegt dann jede Klasse eine Benachrichtung (und das Packet), wenn eine bestimmte Packetart empfangen wurde.
So weit so gut. Frage ist jetzt aber: Wie greife ich von den Observer Klassen, auf das Observable zu, ohne dort unnötige units einzubinden oder Zugriff auf Dinge zu ermöglichen, die gar nicht gebraucht werden?

Struktur sieht im Grunde so aus (um die 2 wichtigsten Fälle abzudecken):
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TAccount{
  TObserver1
  TFoo
  TObservable{
    TBar{
       TObserver2
    }
  }
}



Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 07.03.2011 um 09:25
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.03.11 20:57 
Die beobachtende Klasse hat bei dem Pattern in der Regel vollen Zugriff auf das zu beobachtende Objekt.

Umgekehrt wiederum steht nur das notwendigste zur Verfügung, weshalb diese Richtung sehr gut mit einem Interfase realisiert werden kann. In dem Interface sind dann nur wenige Methoden zur Aktualisierungsbenachrichtigung für bestimmte Daten vorhanden.

So ganz passt das Pattern hier zwar nicht, aber vom Prinzip her ist es ähnlich. Die Frage ist vor allem was die Parserklassen mit den Daten machen.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: So 06.03.11 22:17 
In dem Fall bekommt die registerObserver Prozedur eine Prozedur of class (und den Opcode) statt dem Objekt an sich, aber das ist ja keine große Änderung gegenüber dem Pattern, im Gegenteil.
Und die andre Richtung ist halt das Problem. Iwie muss der Observer ja die Obersevable Instanz kriegen oder sich holen können. Nur wie?

Die Parserklassen nehmen das Packet, lesen die Daten aus und zeigen die an bzw speichern die in Strukturen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.03.11 22:56 
Ich würde es z.B. über eine Klasseneigenschaft plus Singleton-Pattern machen. Je nachdem wie das bei dir aussieht. Das geht natürlich nicht, wenn du mehrere solcher Objekte hast. Dann bliebe z.B. eine globale Variable, in der explizit die Instanz steht.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 06.03.11 23:18 
Nur nebenbei: Das klassische Observable-Pattern mit Interfaces ist eher ein Java-Ding. Bei C# und Delphi hast du Delegates oder Methodenreferenzen, die du hinterlegen kannst. Beim Observable-Pattern kriegen auch immer alle alles mit, was hier nicht unbedingt passt (wie jaenicke bereits gesagt hat).

Bzgl. Zugriff. Die Daten kannst du als Payload mit dem Event mitschicken. Das Event kann auch etwas zurückgeben, wenn das Sinn macht.