Command Design pattern



  • Hallo ich habe folgendes vor:

    Ich habe 2 Plugins, die ich mit Kommandos steuern will. Explizit soll das so aussehen, dass über eine übergeordnete Klasse ein Plugin angewiesen werden kann, die methode eines anderen auszuführen. Mir wurde gesagt das kann ich mit dem "Command Design Pattern" machen. Ich habe schon gegooglet, habe auch sehr viel gefunden, allerdings verstehe ich es nicht. Vielleicht könnt ihr mir ja mehr helfen.

    Meine Klassenhierachie sieht in etwa so aus:

    * PluginManager
    |_ PluginBase
    |_PluginBasis1
    |_Plugin1
    |_Plugin2
    |_Plugin3
    |_PluginBasis2
    |_Plugin1
    |_Plugin2

    Ich will die Kommandos vom Pluginmanager aus senden. Ich habe leider noch keinen Code, habe es nur mit UML moduliert.

    Gruß fluxy



  • hmmm irgendwie sind meine Formatierungen weg... aber vielleicht könnt ihr euch ja denken was wozu gehört...



  • fluxy schrieb:

    hmmm irgendwie sind meine Formatierungen weg... aber vielleicht könnt ihr euch ja denken was wozu gehört...

    ehrlich gesagt nicht. Mit [ code] [/ code] bleiben die Formatierungen erhalten.



  • Hallo fluxy,
    also bei deiner Hierarchie hab ich auch nicht so ganz durchgeblickt. Aber das Commandpattern ist eigentlich eine ziemlich einfache Sache. Im Prinzip besteht das ganze Konstrukt aus zwei Komponenten, den Commands und einem Handler. Die Commandklassen baust du am besten in einer Hierarchie mit einer abstrakten Oberklasse und für jede Aktion eine eigene Unterklasse. Sie müßen auf jeden Fall eine execute-Funtion haben, die die eigentliche Aktion ausführt (warscheinlich mußt du dem Object einige Zeiger auf relevante Programmteile mitgeben, je nach dem). Der Handler hat dann eine Funktion, die ein Command-Object als Argument bekommt und die execute-Funktion aufruft.
    Mehr ist eigentlich nicht dran an der Sache. Es wird eigentlich nur statt eines direkten Aufrufs einer Funktion ein Object erstellt, das die Aktion dann ausführt. Damit kann man dann so schöne Sachen wie Undo/Redo, Cachen und Scheduling von Befehlen machen....



  • Naja im Prinzip soll das ganze so aussehen, dass die Anwendung einen PluginManager nutzt, der die Aufgabe hat, einzelne Plugins zu managen. Managen heisst hier, dass er die Plugins starten, registrieren, stoppen und zerstören soll und wenn nötig soll er in der Lage sein, vom einem Plugin eine Anfrage zu bekommen, in einem anderen Plugin eine Methode auszuführen und dies dann auch zu tun.

    Beispiel: Ich habe ein Renderplugin und ein GUI-Plugin. Für den Fall das eine WinApi anwendung mit DirectX erzeugt werden soll würde der Manager also zuerst das GUI Plugin starten (WinApi dll) und dann das Renderplugin (D3D9 dll). er würde das fenster erstellen und den renderer aufrufen.

    Dann würde der Renderer aber irgendwann feststellen dass seine Rendermethode z.B. in der Nachrichtenschleife des GUI Plugins aufgerufen werden soll. Prinzipiell soll dann das Renderplugin den Manager auffordern, seine rendermethode in dem guiplugin aufzurufen.

    Geht das so oder mache ich etwas falsch? wie würdet ihr denn da verfahren?



  • hi fluxy,

    dein pluginmanager sollte nur das machen, was normalerweise von managern erwartet wird, nämlich objekte zu verwalten. die kommunikation zwischen einzelnen plugins lässt sich zB per design vorschreiben in form von beziehungen (zB referenzen). so muss zB für das initialisieren von d3d ein gültiges HWND angegeben werden, welches beispielsweise im konstruktor übergeben wird. möchte man das fenster noch abstrakter halten und d3d mit einem fenster intern verbinden, die nötigen winapi aufrufe aber vor dem user "verstecken", lässt sich das auch kapseln. das konzept verwendet zB Ogre3D.

    das command pattern ist für deinen fall eher weniger geeignet. handelt es sich um zwei wirklich unabhängige objekte ohne jede verbindung zueinander, so dürfte ein plugin nicht selbstätig das andere aufrufen. der anwender nutzt von den plugins die interfaces und muss sich um entsprechende kommunikation dann selbst kümmern. beispiel: frame rendern, input abfragen, sound ausgeben usw.
    schau dir mal das design pattern abstract factory an, vielleicht passt das eher zu deinem vorhaben.

    gruss,
    Sebastian



  • hmmm was soll dein das jetzt sein? Vielleicht kann jemand mal kurz den Sinn davon erklären. Ich dachte mir nämlich, dass command pattern (oder wie es auch immer heisst), kann ich benutzen um Events zu senden. In den meisten Beispielen gab es da eine abstrakte executemethode die vom Sender überschrieben werden kann. Ich hatte das dann so verstanden, dass der Empfänger über eine Callbackmethode die überschriebene executemethode ausführen kann.

    Habe ich da etwas falsch verstanden oder ist das so richtig? Wenn das so richtig ist, könnte ich doch theoretisch einfach in meiner abstrakten Pluginbasis eine Methode work () bereitstellen, die die plugins überschreiben müssen. In dieser Methode work könnte man dann z.B. eine Methode aufrufen.

    Naja ich schreibe das hier so hin als wäre es vollkommen klar, aber in Wirklichkeit verunsichert mich die Sache ganz schön. Vielleicht kann mal jemand dazu ein Statement abgeben.

    Gruß Sebastian 😃 der andere....


Anmelden zum Antworten