Das Muster des Befehlsobjekts ist eines, das ich immer noch nicht richtig begreifen konnte, und ich habe eine Implementierung in dem Code gefunden, an dem ich gerade arbeite, also habe ich es lange und intensiv studiert, um zu sehen, ob ich es endlich mit einem Beispiel aus der realen Welt verstehen kann. Das Problem ist, dass ich mir sicher bin, dass es nicht richtig implementiert ist und dass es nur ein Versuch von jemandem ist, der gerade darüber gelesen hat und dachte, dass es hier Sinn macht.
Erlauben Sie mir, es Ihnen zu zeigen (aus Gründen der Vertraulichkeit wird es stark vereinfacht sein, aber ich werde mein Bestes tun, um die wichtigsten Konzepte zu zeigen):
public class CommandOne
{
public CommandOne(Manager manager, MyForm form)
{
m_manager = manager;
m_form = form;
}
public void Execute()
{
m_manager.CommandOne(m_form);
}
}
public class CommandTwo
{
public CommandTwo(Manager manager, MyForm form)
{
m_manager = manager;
m_form = form;
}
public void Execute()
{
m_manager.CommandTwo(m_form);
}
}
Das erste, was mir auffällt, ist, dass diese beiden Klassen weder von einer abstrakten Klasse erben noch eine gemeinsame Schnittstelle implementieren.
Der Code, der diese Befehle verwendet, lautet wie folgt:
public class MyForm : System.Windows.Forms.Form
{
public MyForm(Manager manager)
{
m_manager = manager;
}
private void SomeMethod()
{
....
var cmd = new CommandOne(manager, this);
cmd.Execute();
...
}
private void OtherMethod()
{
....
var cmd = new CommandTwo(manager, this);
cmd.Execute();
...
}
}
So wie ich das sehe, ist dieses Formular absolut an alle beteiligten Klassen gekoppelt, mit Ausnahme des Managers, der über seine Konstruktoren in das Formular injiziert wird. Mit diesem Code sehe ich also wirklich keinen Vorteil darin, die "Befehlsklassen" zu erstellen, die im Grunde nur den Aufruf der Methoden des Managers delegieren, da das Formular sie instanziiert, wenn es sie braucht, und die Ausführungsmethode direkt danach aufruft.
Könnte also bitte jemand erklären, welche Teile, wenn überhaupt, dieser Implementierung fehlen, um wirklich ein Befehlsobjektmuster zu sein, und, obwohl es vielleicht zu subjektiv ist, was wäre der Vorteil, es in diesem Fall zu implementieren?
Ich danke Ihnen.