Gibt es für ein komplexes Objekt mit vielen Zuständen ein Muster für die Darstellung verschiedener Funktionen in Abhängigkeit von diesem Zustand?
Ein konkretes Beispiel: Stellen Sie sich eine Printer
Objekt.
-
Über die Schnittstelle des Objekts können Sie zunächst die Fähigkeiten des Druckers abfragen, Einstellungen wie die Papierausrichtung ändern und einen Druckauftrag starten.
-
Wenn Sie einen Druckauftrag gestartet haben, können Sie ihn zwar noch abfragen, aber Sie können keinen weiteren Auftrag starten oder bestimmte Druckereinstellungen ändern. Sie können eine Seite starten.
-
Sobald Sie eine Seite begonnen haben, können Sie die eigentlichen Text- und Grafikbefehle eingeben. Sie können die Seite "fertigstellen". Sie können nicht zwei Seiten gleichzeitig öffnen.
-
Einige Druckereinstellungen können nur zwischen den Seiten geändert werden.
Eine Idee ist es, eine Printer
Objekt mit einer großen Anzahl von Methoden. Wenn Sie eine Methode zu einem ungünstigen Zeitpunkt aufrufen (z. B. wenn Sie versuchen, die Papierausrichtung in der Mitte einer Seite zu ändern), würde der Aufruf fehlschlagen. Wenn Sie in der Sequenz vorwärts springen und mit dem Aufruf von Grafiken beginnen, könnte die Printer
Objekt könnte implizit den Aufruf der StartJob()
y StartPage()
Methoden nach Bedarf. Der größte Nachteil dieses Ansatzes ist, dass er für den Aufrufer nicht sehr einfach ist. Die Schnittstelle könnte überwältigend sein, und die Anforderungen an die Reihenfolge sind nicht sehr offensichtlich.
Eine andere Idee ist, die Dinge in einzelne Objekte aufzuteilen: Printer
, PrintJob
und Page
. Die Printer
Objekt stellt die Abfragemethoden und eine StartJob()
Methode. StartJob()
gibt eine PrintJob
Objekt, das über Abort()
, StartPage()
und Methoden zur Änderung nur der veränderbaren Einstellungen. StartPage()
gibt eine Page
Objekt, das eine Schnittstelle für die eigentlichen Grafikaufrufe bietet. Der Nachteil liegt hier in der Mechanik. Wie kann man die Schnittstelle eines Objekts offenlegen, ohne die Kontrolle über die Lebensdauer dieses Objekts aufzugeben? Wenn ich dem Aufrufer einen Zeiger auf ein Page
Ich will nicht, dass sie es tun. delete
und ich kann ihnen kein weiteres geben, bis sie das erste zurückgeben.
Halten Sie sich nicht zu sehr am Beispiel des Druckens auf. Mir geht es um die allgemeine Frage, wie man je nach Zustand des Objekts unterschiedliche Schnittstellen darstellen kann.