2016-11-28 17 views
1

Die Beispiele, die ich im Internet gesehen habe, geben nur Methode zum Observable-Objekt. Was, wenn ich auch einige Daten an die Beobachter weitergeben möchte, damit sie wissen, ob sie darauf reagieren sollen oder nicht? Ermöglicht das Beobachtermuster die Weitergabe der Daten, wie zum Beispiel:Beobachtermuster: Benachrichtigen mit Zustand

notifyObservers(Event e).

Oder vielleicht sollten die Beobachter selbst die Veränderung ziehen? Wie vielleicht: notifyObservers() -> call observer.update()

und dann jeder Beobachter entscheidet, ob die neuen Daten für sie relevant sind, observable.getData(). Bei diesem Ansatz ist es mir jedoch unklar, wie man nur die Daten erhält, die sich geändert haben, wenn sie überhaupt benötigt werden.

bearbeiten, Beispiel:

sagen, dass ich ein Taxi-Unternehmen mit Betreibern, Kunden und Taxi machen wollen. Wie @ Pritam Banerjee Antwort, werde ich sagen, dass Taxiunternehmen ist ein Vermittler zwischen Betreibern und Kunden (z. B. warum - Client kann ein Taxi telefonisch oder online anrufen). Dann sind meine Operatoren Untertanen, und Taxis sind Beobachter.

Operator ---observes---> TaxiFirm

TaxiFirm(waits for client) ---notifies one---> Operator (Firma wählt aus, welche Betreiber verantwortlich ist, und leitet einen Client Operator)

Taxi ---observes all---> Operators (müssen irgendwie Daten hier drücken, wenn das Taxi besetzt ist, kann es nicht neu akzeptieren client)

Taxi ---notifies---> Operator (wenn ein Taxi einen Kunden akzeptieren kann, wird es den Fahrer darüber informieren, ich mache mir keine Gedanken über die Rennbedingungen, weil dieses Ereignis manuell ausgelöst wird. Vielleicht sollte Taxi die Firma und nicht den Operator benachrichtigen?)

Ich denke, es ist möglich, dass TaxiFirm müssen nicht Client Betreiber übergeben, sondern über das wahre Leben zu denken, es ist wirklich Betreiber, die den Kunden sprechen ...

ich geschrieben habe mein Gedankengang nach unten, bitte Hilf mir dabei, die Architektur für dieses Modell herauszufinden.

+0

Ich denke, dass Sie Ihren Fluss mit der Sorge der Java-Implementierung neu definieren müssen. Deine ersten 2 Zeilen sind in Ordnung. Die Firma sollte ein unbesetztes Taxi für einen unbelegten Betreiber auswählen und ihn (Betreiber) mit den Kunden- und Taxiinformationen benachrichtigen. :)) –

+0

Siehe meine aktualisierte Antwort. – MarcG

Antwort

1

Natürlich ermöglicht das ObserverPattern die Weitergabe von Informationen über seine notify Methode.Wenn ein Taxi die Client-Info braucht können Sie einfach passieren:

observer.notify(ClientInfo info) 

Und natürlich konnten die Beobachter, sondern fordern Sie die Info:

observer.notify() 

void notify() { 
    update(); 
} 

Beide sind möglich, aber dann würde ich nicht sagen, Du hast wirklich das ObserverPattern hier. Gemäß diesem Muster benachrichtigt der Betreffende einfach alle Beobachter. Aber was Sie beschrieben haben, ist, dass der Betreffende eines der Taxis benachrichtigen, auf seine Antwort warten muss (wenn das Taxi bereits einen Passagier befördert) und dann möglicherweise das nächste Taxi benachrichtigen. Du könntest das eine Variation des ObserverPattern nennen, aber es ist anders.

Ein einfacher Vorschlag, für Sie, um loszulegen:

Klasse Betreiber:

List<Taxi> taxis; 

boolean chooseTaxi(RideNumber rideNumber) { 
    for (Taxi taxi : taxis) { 
     boolean isAccepted = taxi.notify(this, rideNumber); 
     if (isAccepted) { 
      markTaxiRideAsAccepted(taxi, rideNumber); 
      return true; 
     } 
    } 
    return false; // No taxi accepted the ride. 
} 

Klasse Taxi:

boolean notify(Operator operator, RideNumber rideNumber) { 
    if (isTaxiAlreadyCarryingPassenger()) return false; 

    ClientInfo clientInfo = operator.getClientInfo(this, rideNumber); 
    startClientProcess(clientInfo); 

    return true; 
} 

Hinweis: Die RideNumber ist nur eine Identifizierung Nummer, die das Taxi später verwendet, um die Kundendaten von th anzufordern der Betreiber. Sie könnten stattdessen die clientInfo über die notify-Methode senden, aber dann würden alle Taxis diese Informationen bekommen, was für die Sicherheit schrecklich ist und auch verwirrend sein könnte (das Senden von Informationen, die nicht verwendet werden sollten).


Update:

Wenn dies eine Hausaufgabe ist, und Sie müssen die genauen ObserverPattern verwenden, können Sie dies tun:

Klasse Betreiber:

List<Taxi> taxis; 

void notifyAllTaxis(RideNumber rideNumber) { 
    for (Taxi taxi : taxis) { 
     taxi.notify(this, rideNumber);    
     } 
    }   
} 

ClientInfo getClientInfo(this, rideNumber) { 
    if (isRideNotYetAccepted(rideNumber)) { 
     markRideAsAccepted(taxi, rideNumber); 
     return getClientInfo(rideNumber); 
    } 
    else return null; 
} 

Klasse Taxi:

void notify(Operator operator, RideNumber rideNumber) { 
    if (!isTaxiAlreadyCarryingPassenger()) { 

     ClientInfo clientInfo = operator.getClientInfo(this, rideNumber); 
     if (clientInfo != null) startClientProcess(clientInfo); 
    } 
} 
+0

Danke für die Erklärung. Das Beispiel, das du mir gegeben hast, ist technisch gesehen kein Beobachtermuster, oder? Wie Sie gesagt haben, sollte es alle Beobachter benachrichtigen, und hier benachrichtigt Operator Taxis eins nach dem anderen, solange es kein freies Taxi findet. Ich kann nicht sagen, dass es mir gut steht, da ich speziell das Observer-Muster verwenden muss. Vielleicht ein anderer Weg, dies zu tun wäre: Taxis beobachten Betreiber, Betreiber benachrichtigt alle Taxis über den Kunden, alle kostenlosen Taxis benachrichtigen die Betreiber, dass sie den Kunden akzeptieren können, Betreiber wählt ein Taxi, und verbindet es mit Client ... –

+0

Wenn ich dies schreibe, scheint es, als ob es ein ganz anderes Muster erfordert, oder vielleicht eine Zwei-Wege-Beobachtung. Nicht sicher, ob der pure Beobachter in diesem Kontext jetzt Nutzer sein kann. –

+0

Ich bin nicht sicher, wo ich das reale Beobachtermuster in diesem Zusammenhang verwenden kann. Von allen Entitäten muss wirklich nur der erste, der eine Bedingung erfüllt, benachrichtigt werden ... –

1

Sie Observer Design Muster mit Mediator Muster verwenden können, so dass die Anwendung kann auch Daten an die anderen verwandten Anwendungen abonnieren und veröffentlichen. Für ein Beispiel können Sie über here schauen.

Für weitere Details zu Mediator Design Patterns können Sie dies lesen article.

+0

Ich habe das Beispiel überprüft, bin mir aber immer noch nicht ganz sicher, wie es mit dem Beobachtermuster zusammenpasst. Es scheint, dass es eine Möglichkeit ist, Referenzen zwischen kommunizierenden Objekten zu kapseln. Ich werde die Frage mit einem konkreteren Beispiel bearbeiten. –