2017-10-30 1 views
0

Ich frage mich, ob dies unter einem Strategie-Muster fällt:Ist das ein Strategie-Muster?

Ich habe eine Liste von IConverter (Sie konvertieren Dateien in Ingame Assets). Sie sitzen alle in einem ConverterManager. Jeder IConverter hat einen Erweiterungstyp, nach dem er sucht. Sagen wir, wir haben eine Datei mit der Erweiterung .exe. Der ConverterManager sucht nach dem Konverter, der nach der EXE-Erweiterung sucht. Wenn es existiert, wird es den Pfad der Datei durchlaufen, wenn nicht, wird es nichts tun.

Ich frage mich, ob dies ein Strategie-Muster ist, obwohl ich bin zu berechnen, welches Verhalten basierend auf der Erweiterung der Datei zu wählen.

Vielen Dank im Voraus.

Antwort

0

Technisch ist es nicht genau Strategie Muster, weil Sie alle Instanzen in Ihrem Manager halten, und ich würde annehmen, dass die Konvertierung auch. Dies folgt nicht Single Responsibility principle.

Um Ihr Design zu ändern, um die technischen Details der Strategie-Muster zu befriedigen würde ich vielleicht rufen Sie die ConverterManager ein AssetFactory (oder was auch immer passt zu Ihrem Fall), wo Sie einige Eingabedatei geben und die erstellte Vermögenswert erhalten (s) und es wird die IConverter Schnittstelle dazu verwenden.

Dann würden Sie auch die Logik trennen müssen, die aufgelöst wird, welche iConverter vom ConverterManager durch bestimmte Datei verwenden. Benennen Sie diese Klasse ConverterResolver oder ConverterFactory und dann tauschen Sie die iConverter Instanz des AssetFactory um das Design Akt zu machen wie reines Strategie-Muster.

Aber es kann sein, dass Strategie Muster wirklich nicht für diesen Fall überhaupt geeignet ist und es einfach als Fabrikmuster implementieren ist genug.

+0

Können Sie mir hier helfen? Folgt mein Beispiel nicht dem Prinzip der einfachen Verantwortung, weil mein ConverterManager alle Konverter enthält und sie nach Erweiterungstyp auswählt oder hat er etwas mit den Konvertern zu tun? Derzeit hält der ConverterManager die Konverter und wählen Sie den einen auf der gegebenen Erweiterung (der IConverter gibt die Erweiterung zurück) und dann der IConverter die Umwandlung in das Asset. – patrick

+0

Ich bin mir immer noch nicht sicher, welche Klasse den ausgewählten IConverter basierend auf der Erweiterung verwendet. –

+0

Nun, ich habe eine Klasse, die alle Dateien im Asset-Ordner liest. Wir könnten dann eine Liste wie "test.txt, test2.exe, test3.js" haben. Wenn sie alle gefunden sind, wird die Liste der Dateien durchlaufen und jedes einzelne an den ConverterManager gesendet. Dann findet der ConverterManager den IConverter basierend auf der Erweiterung und verwendet die Funktion ProcessFile (path) darauf. (Es wird den IConverter nicht zurück in die filereader-Klasse zurückgeben). Das einzige, was der ConverterManager zurückgibt, ist ein Antwortdatenobjekt, das zeigt, was bei der Konvertierung passiert ist (aber das ist nicht wirklich relevant). – patrick