Observer-Pattern
-
Hallo, ich frage mich gerada, wie man folgendes am besten löst:
Klasse BeobachtetMich hat 3 Zustände, die wichtig für andere Klassen wären.
SOllte ich nun 3 konkrete Observable-Klassen schreiben?
So was wie
Observable_State_A ...
oder wie macht man sowas?
Wichtig dabei ist, dass sich manche Beobachter nur für einen der Zustände oder 2 oder eben einer Teilmenge interessieren, so dass eine Benachrichtigung über alle Zustände sinnlos wäre.
-
Welche Sprache?
In C# z.B. ist das Observerpattern mit events fest in der Sprache verankert.Erlaubt deine Sprache Interfaces? Abstrakte Basisklassen? Alles wichtig zu wissen für eine saubere Implementierung.
Ansonsten hast Du zwei Möglichkeiten: Du kannst jedem Observer entweder die Möglichkeit geben, sich die gewünschten Daten aus dem Observable zu ziehen. Das kann die Kapselung aufweichen. Oder Du sendest einen kompletten Satz an Daten bei einer Benachrichtigung und die Observer verwerten nur was sie benötigen. Das kann hässlich sein.
"SOllte ich nun 3 konkrete Observable-Klassen schreiben?"
Im Allgemeinen nicht. Nur Eine.Wie immer: Bitte mehr Information.
-
Ist C++
Im Moment habe ich
class Observable;
class Observer;class ObserveStateA : Observer;
...Ich gebe im Moment noch das ganze Observable mit und lasse den Observer entscheiden, was er damit tut. Ist aber iwie unschön
-
Es liegt bei Dir für welche Variante Du Dich entscheidest. Wenn die drei "Zustände" semantisch verwandt sind, würde ich mich nicht für drei Observer entscheiden. Das wären mir zu viel kleine, kaum unterscheidbare Klassen.
Du kannst evtl. auch eine Observer-Klasse mit drei virtuellen Methoden und leeren Methodenrümpfen anbieten. Die drei unterscheiden sich dann nur im Parametertyp, welcher jeweils einen der drei Zustände repräsentiert. Die konkreten Observer überschreiben dann die Methoden, die sie interessieren.
Oder Du übergibst einfach, wie Du es glaube ich jetzt schon machst, das Observable und die Observer ziehen sich raus was sie brauchen.
So oder so: Irgendwo musst Du bei diesem (und fast allen anderen) Pattern Abstriche machen, was eine saubere Implementierung betrifft.