Zusammengesetzte Strategie Muster - Java - Wie schlimm ist dieser Code?

8

Diese Frage ist eine Art Fortsetzung zu meinem früheren Beitrag: Besuchermusterimplementierung in Java - Wie sieht das aus?

Ich habe mich beim Refactoring meines Codes etwas verwirrt. Ich versuche, mein Besuchermuster (das im vorherigen Post erklärt wurde) in ein zusammengesetztes Strategie-Muster umzuwandeln. Ich versuche so etwas zu tun:

%Vor%

Nun würde ich eine Regel wie folgt definieren:

%Vor%

Nun könnte ich zwei verschiedene Arten von Objekten validieren lassen. Diese zwei könnten völlig unterschiedlich sein: Angenommen, ich habe einen Store, der Validatable ist, und dann einen Schedule , der Validatable ist. Nun, wenn ich eine Zusammensetzung schreiben würde, die wie folgt aussehen würde:

%Vor%

Ich würde ein enum definieren, das definiert, welcher Satz von Prüfungen wohin geht ...

%Vor%

und schließlich würde ich es so verwenden:

%Vor%

Ich habe das seltsame Gefühl, dass mein Design fehlerhaft ist. Mir gefällt die Idee nicht, dass meine Regelschnittstelle ein Validatable erwartet. Können Sie mir bitte vorschlagen, wie ich das verbessern könnte?

Schätzen Sie Ihre Hilfe.

    
Jay 04.06.2009, 13:49
quelle

2 Antworten

4

Ersetzen Sie Validatable durch einen generischen Typparameter T, um den Validierungsframework-Typ sicher zu machen.

%Vor%

Lassen Sie uns unser Framework mit einem Interface ValidationStrategy erweitern:

%Vor%

Wir haben es mit Regeln zu tun, die durch "? super T" begrenzt sind, so dass wir eine Regel für Animal to Dog Validator hinzufügen können (vorausgesetzt, Dog extends Animal). Der Validator sieht nun so aus:

%Vor%

Nun können wir ein Beispiel DogValidationStrategy wie folgt implementieren:

%Vor%

Oder, wie in Ihrer Stichprobe, haben wir vielleicht ein Enum, das mehrere Strategien zur Hundevalidierung anbietet:

%Vor%     
chris 07.06.2009, 16:24
quelle
9

Als ich zum ersten Mal von Designmustern erfuhr, versuchte ich immer wieder Orte zu finden, an denen ich sie verwenden könnte. Ich habe inzwischen gelernt, dass vorzeitige "Musterbildung" ist wie eine vorzeitige Optimierung. Versuchen Sie zuerst, es auf eine direkte Art und Weise zu tun, und dann sehen, welche Probleme Sie gibt.

Versuchen Sie, mit minimalen Schnittstellen und Unterklassen zu entwerfen. Wenden Sie dann das Muster an, das für die offensichtlichen Redundanzen, die Sie finden, geeignet sein könnte. Ich habe den Eindruck von diesem und dem vorherigen Beitrag, dass Sie Ihren Code überarbeiten könnten.

    
Jeremy Stein 04.06.2009 14:14
quelle