2017-05-03 4 views
0

Ich habe zwei Klassen - zu verarbeiten Klasse A und B.Welche Design-Muster für mein Szenario geeignet ist

Klasse A erhält eine Nachricht von der oberen Schicht, und ich möchte diese Nachricht an Klasse B zu übermitteln. Wenn B diese Nachricht verarbeitet, aktualisiert es seinen eigenen Status und generiert einige Ereignisse. Es gibt eine Methode in Klasse A, die diese Ereignisse an die obere Ebene senden kann.

Ich kann sendEventToUpperLayer() in Klasse A nicht ändern. Also wie kann ich die generierten Ereignisse in Klasse B und seinen Status wieder in Klasse A zurückgeben? Soll ich Klasse B einfach verwerfen und die Logik von Klasse B in Klasse A verschieben?

public class A { 
    private B b; 
    private void processMessage(Message) { 
     b.processMessage(Message); 
    } 

    private void sendEventToUpperLayer() { 
    } 
} 

public class B { 
    public void processMessage(Message) { 
     // It will generate a few events and update b's state. 
     // All these events and b's state will need to use class A's method of sendEventToUpperLayer() to forward to upper layer. 
    } 
} 
+0

Ehrlich gesagt ist nicht klar, was Sie versuchen zu tun. Ich könnte einen Vorschlag riskieren, werfen Sie einen Blick auf [Beobachtermuster] (https://en.wikipedia.org/wiki/Observer_pattern) – freedev

+0

Danke fredev. Eigentlich ist Observer Pattern das erste Muster, das mir in den Sinn kommt. Das Beobachtermuster beinhaltet jedoch nur beobachtbare Beobachter. In meinem Fall betrachte ich meine Klasse A als beobachtbar und Klasse B als Beobachter, da die Klasse A die Klasse B mit b.processMessage (Message) benachrichtigt. Aber meine Frage ist, wie kann Klasse B die Methode der Klasse A verwenden, die inverse Benachrichtigung ist? –

+0

Sie könnten auch mit Delegierung versuchen, indem Sie an das enthaltene 'B' ein Lambda, eine Methode oder ein Objekt übergeben, das nützlich ist, um den Container' A' zurückzurufen. – freedev

Antwort

0

Haben class A eine Schnittstelle für das Senden von Nachrichten implementieren, eine, die sendEventToUpperLayer oder eine genericly namens Version eines solchen (die Implementierung dann Delegierten des bestehenden sendEventToUpperLayer-Methode) erklärt.

Dann übergeben class A zu class B 's processMessage Methode als Parameter, die Klasse B akzeptiert als die benannte Schnittstelle (nicht direkt als Klasse A).

Klasse B kann dann rufen die notwendige Methode der Klasse A so oft wie nötig, und da es sich um eine Schnittstelle ist nicht Klasse A direkt benötigen und Einheit in geeigneter Weise getestet werden können usw.

Gegebenenfalls können Sie übergeben Sie auch die Klasse A (über eine Schnittstelle wie oben erwähnt) an die Klasse B im Konstruktor der Klasse B, wenn sich die Instanz der Klasse B immer auf dieselbe Instanz der Klasse A für ihre Rückrufe bezieht.

+0

Danke Trevor. Ihr vorgeschlagener Weg ist viel besser als das, was ich über die Instanz von Klasse A dachte. Eigentlich denke ich auch über eine zweite Lösung nach, um Klasse B zu verwerfen und Klasse B in Klasse A zu verschieben. Wie also schlagen Sie für beide Lösungen Vor-/Nachteile vor? –

+0

@ Lazysheep.wang Hängt davon ab wie stark die Klassen gekoppelt sind. Wenn Klasse B niemals außerhalb einer Klasse A existieren wird, dann könnten Sie ihre Logik kombinieren oder Klasse B als innere Klasse der Klasse A implementieren. Allgemein gesprochen fühlt es sich jedoch oft sauberer an, wenn Sie die Logik entsprechend in separate Klassen aufteilen. Selbst wenn Sie die Klasse A in die Klasse B überführen müssen. Das hängt wirklich von den Details des jeweiligen Falls ab (zB hat Klasse B Daten/Status oder sind es nur Methoden usw.). –

Verwandte Themen