4 Stimmen

Wie kann man die Schnittstelle eines Objekts abhängig von seinem Zustand ändern?

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.

0voto

troelskn Punkte 110542

Eine andere Idee ist, die Dinge in einzelne Objekte aufzuteilen: Printer, PrintJob und Page. Das Printer-Objekt stellt die Abfragemethoden und eine StartJob()-Methode zur Verfügung. StartJob() gibt ein PrintJob-Objekt zurück, das über Abort(), StartPage() und Methoden zum Ändern der änderbaren Einstellungen verfügt. StartPage() gibt ein Page-Objekt zurück, 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 eine Seite gebe, möchte ich nicht, dass er diese löscht, und ich kann ihm keine weitere Seite geben, bis er die erste zurückgibt.

Dies.

Sie teilen das Objekt in kleinere Objekte auf, und zwar für jeden Teil des Zustands, der relevant ist. Das Problem mit Page#delete ist, dass Ihr Seitenobjekt eine interne Komponente ist. In diesem Fall sollten Sie es nicht direkt offenlegen. Erstellen Sie stattdessen eine neue Klasse, die nur den Zustand repräsentiert, mit allen Methoden, die Sie bereitstellen möchten. Ja, Sie werden am Ende viele feinkörnige Klassen haben, anstatt ein paar (oder eine einzige) große. Das ist ein gute Sache (tm).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X