Als Lernübung (ich bin nicht in der Schule - nur ein alter Mann, der versucht, etwas Neues zu lernen) versuche ich, eine Logikgattersimulation zu schreiben, die eine Ausbreitungsverzögerung beinhaltet. Der Benutzer sollte auch in der Lage sein, Gates zu gruppieren, um übergeordnete Objekte zu erstellen.
Ich möchte Designmuster auf mein Problem anwenden, aber es fällt mir schwer.
Ich lese Head First Design Patterns und sehe, dass das Command Pattern eine gute Möglichkeit ist, elektrische Impulse durch einen Schaltkreis mit Verzögerung zu simulieren. Ich sehe auch, dass das zusammengesetzte Muster eine gute Möglichkeit ist, verschachtelte Einheiten zu simulieren. Ich weiß nur nicht, wie ich die beiden mischen soll.
Mit anderen Worten, wenn ich durch meine Tore gehe, sehe ich, dass das Tor 'x' feuern sollte. Es hat eine Verzögerung von 15 Nanosekunden, daher erstelle ich einen Befehl mit einem Zeitstempel von 15 ns ab der aktuellen Spielzeit. Wo ist der Dispatcher? Im Beispiel des Diner, wobei der Befehl die 'Bestellung' ist, senden die Kellnerin und der Koch jeweils den Befehl aus und haben die Möglichkeit, eine Verzögerung einzuführen. Wenn ich ein 'zusammengesetztes' Tor habe, hat es auch einen eigenen Dispatcher? Muss ich einen Singleton verwenden, um die Warteschlange zu verwalten?
Ich habe gelesen, was ich finden konnte, aber ich brauche noch einen Schub in die richtige Richtung:
quelle
Antworten:
Vielleicht möchten Sie sich ein Beispiel aus der Programmierung in Scala ansehen , da es einen Simulator gibt, der das tut, was Sie in Java versuchen:
http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6
Wenn Sie sich ihren Ansatz ansehen, finden Sie möglicherweise heraus, wie Sie Ihr Programm ändern können, um das gewünschte Verhalten zu erzielen.
Sie haben erwähnt, dass Sie es nicht einfach hinzufügen können. Erklären Sie also, wie Sie vorgehen und auf welche Schwierigkeiten Sie stoßen, damit die Leute Ihnen einige Vorschläge machen können, die Sie möglicherweise nicht berücksichtigt haben.
Wie bereits erwähnt, sind Entwurfsmuster eine Möglichkeit, als Kurzform darüber zu sprechen, was Ihr Code tut, aber die Idee, Entwurfsmuster zu erzwingen, scheint nur eine schlechte Idee zu sein.
Grundsätzlich sollte eine Laufzeitverzögerung nicht schwierig sein.
Sie können eine Basisklasse haben, die ist
Gate
, und in ihr eine Verzögerung setzen.Alle Tore erstrecken sich davon und stellen die tatsächliche Verzögerung ein.
Wenn Sie einem Signal folgen und sich in einem Gate befinden, kann dieser Thread für die simulierte Verzögerung in den Ruhezustand versetzt werden. Dies bedeutet jedoch auch, dass Sie die Echtzeit Ihrer simulierten Zeit zuordnen müssen, da Ihr Simulator langsamer als ein reales System ist wäre.
Wenn Sie feststellen, dass Sie zu viele Threads haben, fügen Sie diese einfach in eine sortierte Liste ein, und zwar nach dem nächsten oben. Wenn Sie pausieren, geben Sie einfach die Zeit ein, zu der die Verzögerung abgeschlossen ist, und der Simulator wählt in jeder Schleife diejenigen aus, die jetzt bereit sind Führen Sie die nächste Aktion aus, und dann erfolgt die nächste Verzögerung.
Dies wäre ähnlich wie bei einer Spielschleife.
quelle
Dann verwenden Sie nicht das Befehlsmuster.
Lieber Gott, nein. Der gesamte Punkt des zusammengesetzten Musters besteht darin, dass Sie ein zusammengesetztes Objekt an einen Ort liefern können, an dem nur ein Objekt erwartet wird. Auf diese Weise können Sie das Verhalten auf vernünftige Weise zusammenstellen.
Auf keinen Fall. Haben Sie nur eine Köchin und eine Kellnerin auf der ganzen Welt? Haben sie nur eine Küche?
Das Mischen des Befehls und des zusammengesetzten Musters ist ziemlich einfach. Sie haben eine Schnittstelle, die einen Befehl darstellt. Jeder konkrete Befehl kann diese Schnittstelle überschreiben (oder auf andere Weise in Nichtvererbungssprachen erfüllen), um ein bestimmtes Verhalten bereitzustellen. Ihre Verzögerung ist ein solches einfaches Verhalten.
Das zusammengesetzte Muster bietet zwei (oder mehr) Objekte / Verhaltensweisen hinter einer einzigen Schnittstelle. Die einfachste Verwendung für dieses Beispiel wäre ein zusammengesetzter Befehl, der zwei andere Befehle akzeptiert und dann, wenn er zur Ausführung aufgefordert wird, die beiden gespeicherten Befehle auslöst. Auf diese Weise können Sie Ihren isolierten Befehl 'delay' und einen beliebigen anderen Befehl verwenden, um einen verzögerten Befehl zu erstellen.
quelle