Hallo,
ich verwende für eine Applikation das MVC Pattern und Frage mich, was der beste Weg ist Plugins zu integrieren.
Ein Plugin soll die Möglichkeit haben die GUI zu modifizieren, wie z.B. MenuItems dem Menu hinzufügen und andere optischen wie funktionalen Veränderungen vornehmen können.
Ein Plugin soll die Möglichkeit haben dem Model etwas hinzufügen ( etwas 'löschen' ist nicht vorgesehen )
Ein Plugin soll auf die hinzugefügte Funktionalität reagieren können.
Ich habe mir ein kleines Beispiel ausgedacht.
Angenommen meine View besteht nur aus einem Textfeld und einem 'save' Button. Mein Model aus einem String und der Kontroller kann als einziges diesen String serialisieren und speichern.
Wie baue ich jetzt am besten einen PluginLoader, der in der Lage ist der View einen zweiten Button hinzuzufügen ( saveAsJSON ) und dem Controller die Funktionalität erweitern kann.
Mein Ansatz wäre jetzt wie folgt:
1. Dem Controller wird eine Map hinzugefügt, die zwischen einem Key und einem PluginExecuteObjekt mappt.
2. Dem Controller wird eine Methode pluginExecuteCommand(String key) hinzugefügt, die auf die Map Zugriff hat und das zum Key passende Objekt heraussucht und eine execute(Model model) Methode aufruft.
3. Vor dem Aufbau der GUI wird das Plugin geladen ( eventuell via Reflection ).
4. Beim Aufbau werden dem Plugin Teile der GUI übergeben, sodass das Plugin der GUI Element hinzufügen kann mit einem Listener zur Methode pluginExecuteCommand("my-json-save-plugin")
5. Das Plugin fügt der Map des Controllers den Key "my-json-save-plugin" hinzu und ein vom Plugin bereitgestelltes pluginExecuteCommand.
(6.) Der User drückt auf den saveAsJSON-Button, die Methode pluginExecuteCommand wird mit dem String "my-json-save-plugin" aufgerufen. Der Controller führt die execute() Methode des PluginObjektes aus und übergibt ihr das Model. Die Plugin Implementation entimmt dem Model den String und speichert dieses als json-Datei ab.
Ich finde das Konzept etwas amateurhaft, aber egal wie ich mich den Kopf zerbreche ich finde keine bessere Lösung. Wie stellt ihr euch eine solches Plugin vor ? Trifft diese Implementierung das was Ihr euch darunter Vorstellt oder muss es noch verbessert werden ? Wenn ja wo ?
Falls Ihr das Beispiel als Code haben wollt, kann ich es gerne Posten, nur dachte ich mir vielleicht bei den relativ vielen Klassen, dass es als Bergbeschreibung vielleicht etwas übersichtlicher ist.
ich verwende für eine Applikation das MVC Pattern und Frage mich, was der beste Weg ist Plugins zu integrieren.
Ein Plugin soll die Möglichkeit haben die GUI zu modifizieren, wie z.B. MenuItems dem Menu hinzufügen und andere optischen wie funktionalen Veränderungen vornehmen können.
Ein Plugin soll die Möglichkeit haben dem Model etwas hinzufügen ( etwas 'löschen' ist nicht vorgesehen )
Ein Plugin soll auf die hinzugefügte Funktionalität reagieren können.
Ich habe mir ein kleines Beispiel ausgedacht.
Angenommen meine View besteht nur aus einem Textfeld und einem 'save' Button. Mein Model aus einem String und der Kontroller kann als einziges diesen String serialisieren und speichern.
Wie baue ich jetzt am besten einen PluginLoader, der in der Lage ist der View einen zweiten Button hinzuzufügen ( saveAsJSON ) und dem Controller die Funktionalität erweitern kann.
Mein Ansatz wäre jetzt wie folgt:
1. Dem Controller wird eine Map hinzugefügt, die zwischen einem Key und einem PluginExecuteObjekt mappt.
2. Dem Controller wird eine Methode pluginExecuteCommand(String key) hinzugefügt, die auf die Map Zugriff hat und das zum Key passende Objekt heraussucht und eine execute(Model model) Methode aufruft.
3. Vor dem Aufbau der GUI wird das Plugin geladen ( eventuell via Reflection ).
4. Beim Aufbau werden dem Plugin Teile der GUI übergeben, sodass das Plugin der GUI Element hinzufügen kann mit einem Listener zur Methode pluginExecuteCommand("my-json-save-plugin")
5. Das Plugin fügt der Map des Controllers den Key "my-json-save-plugin" hinzu und ein vom Plugin bereitgestelltes pluginExecuteCommand.
(6.) Der User drückt auf den saveAsJSON-Button, die Methode pluginExecuteCommand wird mit dem String "my-json-save-plugin" aufgerufen. Der Controller führt die execute() Methode des PluginObjektes aus und übergibt ihr das Model. Die Plugin Implementation entimmt dem Model den String und speichert dieses als json-Datei ab.
Ich finde das Konzept etwas amateurhaft, aber egal wie ich mich den Kopf zerbreche ich finde keine bessere Lösung. Wie stellt ihr euch eine solches Plugin vor ? Trifft diese Implementierung das was Ihr euch darunter Vorstellt oder muss es noch verbessert werden ? Wenn ja wo ?
Falls Ihr das Beispiel als Code haben wollt, kann ich es gerne Posten, nur dachte ich mir vielleicht bei den relativ vielen Klassen, dass es als Bergbeschreibung vielleicht etwas übersichtlicher ist.