A collection of unusual Design Patterns.
Make UI Elements create themselves and integrate into the Application, as soon as they are created.
This is some kind of weird, becuase of the inversion of control: not the toolbar adds the buttons, but buttons add themselves to the toolbar.
Pro | Contra |
---|---|
All the logic is encapsulated at one place. | The creation order of buttons can not be explicitely specified. |
Dynamic changes. Just inject another Toolbar and the Widgets will add themselves to another place. | ? |
Example: Toolbar Buttons are created and injected into the Context. They retrieve the toolbar on their own and add themselves to the toolbar. To communicate with the applicaiton EventBroker is used.
// ... Inject the only Toolbar somewhere into the context. public class ToolbarItemDelObject { @Inject private TableToolbar tableToolbar; @Inject private EventBorker eventBorker; @PostConstruct void create() { // use injected ToolBar. createItem(tableToolbar.getleftPart()); } private void createItem(ToolBar parent) { // create here } }
Problem: How to work around the lifecycle dependencies? What to do if you have GUI COmponents which need to know each to initiate themselves?
Example: Table A's header depends on another table B's header. Table B controls the functionality of Table A, initiates it's display mode.
Pattern: Introduce an own lifecycle.
Ansatz um das Modell (engl. model) und die Ansicht (engl. view) komplett voneinander zu trennen und über einen Präsentator (engl. presenter) zu verbinden.
http://de.wikipedia.org/wiki/Model_View_Presenter
Wer ist für die Synchronisation zuständig?
Supervising Controller (wörtlich etwa „Überwachende Steuerung“) ist ein Entwurfsmuster, das aus der ursprünglichen Variante von MVP hervorgegangen ist und von Martin Fowler definiert wurde. Hierbei übernimmt die Ansicht möglichst alle Aufgaben zur Datensynchronisation, während sich der Präsentator um alle anderen Abläufe zwischen Modell und Ansicht kümmert. Um die Synchronisation möglichst zu vereinfachen, kann auf Datenbindungen (engl. data bindings) zurückgegriffen werden. Dabei stellt der Präsentator Daten über Klassen bereit, die der Ansicht und dem Modell bekannt sind. Der Präsentator selbst sorgt nur noch für die Übertragung der Datenobjekte vom Modell zur Ansicht. Hierdurch entfällt weiterer Synchronisationsaufwand vom Präsentator, da sich die Ansicht selbstständig über die Datenobjekte synchronisiert. Das Modell kann seinerseits ebenfalls über die Datenobjekte auf innerhalb der Ansicht veränderte Daten zugreifen.
Passive View (wörtlich etwa „Untätige Ansicht“) ist ein Entwurfsmuster, das aus der ursprünglichen Variante von MVP hervorgegangen ist und von Martin Fowler definiert wurde. Im Gegensatz zum Supervising Controller existiert keine Verbindung über ein Datenobjekt zwischen Modell und Ansicht. Dies trägt dazu bei, dass der Präsentator jegliche Datensynchronisation zwischen Modell und Ansicht selbst durchführen muss. Das Ergebnis dabei ist, dass die Ansicht nur einfachste Logik zur Anzeige beinhaltet und keine Logik zur Synchronisation von Daten. Dadurch wird der Quelltext der Ansicht äußerst vereinfacht, anders als dies beim Supervising Controller der Fall ist.
Die BroadCasts eignen sich sehr gut, um innerhalb der Application zwischen Komponenten zu kommunizieren. Es eigent sich sehr gut um auf Nutzer Aktionen zu reagieren!
Alle potentiellen EMpfänger müssen aber bereits geladen worden sein!
Deswegen eigent sich ein Brodcast schlecht für automatische Tastk, die eventuell schon beim Laden gestartet werden.
In diesem Fall Besser: ein Modell / State erstellen das von überall erreichbar ist. Die GUI reagiert auf Modell / State Änderungen, meldet sich selbstständig an / ab.
(siehe MVP)
Strategie für die richtige Architektur der Services. Wie geht man das an?