Prof. Dr. Wilhelm Schäfer Christian Brenner Tristan Wittgen Paderborn, 27. Oktober 2014 Besprechung der Aufgaben: 3.-6. November 2014 Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 2 Aufgabe 1 – Beispielsuche Überlegen Sie, an welchen Stellen die Entwurfsmuster (Design Pattern), die Sie bisher kennengelernt haben, in Standardsoftware zum Einsatz kommen könnten. Erläutern Sie kurz, wie Sie sich die Anwendung des Musters vorstellen. Beispiel: Strategy-Muster (Strategy-Pattern) für die Outline in Eclipse: Das StrategyMuster wird angewendet, wenn von einem Algorithmus mehrere Varianten existieren. Die Outline in Eclipse zeigt alle Methoden und Attribute einer Klasse an. Diese können alphabetisch oder nach ihrem Vorkommen in der Klasse sortiert werden. Für den Sortieralgorithmus wird eine Schnittstelle SortAlgorithm implementiert. Die Klassen für die konkreten Sortieralgorithmen AlphabeticSort und AppearanceSort implementieren die Schnittstelle SortAlgorithm. Eclipse erzeugt ein Objekt eines speziellen Sortieralgorithmus, z.B. AlphabeticSort und übergibt es der Outline. Danach interagiert Eclipse ausschließlich mit der Outline. Die Outline leitet die Sortieranfragen von Eclipse über die Schnittstelle SortAlgorithm an AlphabeticSort weiter. Finden Sie drei Beispiele! 1 Aufgabe 2 – Anwendung des Abstract Factory Pattern Ein Entwickler hat einen Prototypen zur Bearbeitung von Datenbanken in einer Anwendung entwickelt. Dabei hat er die Klassen für eine spezielle Datenbank, nämlich MySQL, geschrieben (s. Abbildung 1). Abbildung 1: Klassendiagramm der Datenbankanwendung Nun möchte er den Code so erweitern, dass verschiedene Datenbanken angesprochen werden können. Nutzen Sie das Abstract Factory Pattern, um das Design des Entwicklers zu verallgemeinern! Fügen Sie für Oracle exemplarisch ebenfalls neue Klassen hinzu. Erarbeiten Sie Ihre Lösung in Form eines Klassendiagramms. Aufgabe 3 – Observer-Muster Hinweis: Für die Bearbeitung der Aufgaben benötigen Sie Eclipse und das Eclipse Modeling Framework. Ein gutes Tuturial kann auf dieser Website gefunden werden: http: // www. vogella. com/ articles/ EclipseEMF/ article. html Abbildung 2 zeigt ein Klassendiagramm, in dem das Observer-Pattern eingesetzt wird, um Facebook-Nachrichten zu verfolgen. Zur Vereinfachung wird angenommen, dass alle Nachrichten eines Subjekts FacebookAccount beobachtet werden. Beobachter (Observer ) ist die Klasse MessageObserver. 3.1 Erklären sie, warum die Assoziation subject von der konkreten Implementierung eines Observers, in diesem Fall MessageObserver, zur konkreten Implementierung eines Subjekts, in diesem Fall FacebookAccount, verläuft. Eine alternative Möglichkeit, um die Navigierbarkeit von Beobachter nach Subjekt zu realisieren, wäre es, die Assoziation des observers als bi-direktionale Assoziation umzusetzen. Was wäre dabei allerdings der Nachteil? 3.2 Stellen Sie das Klassendiagramm aus Abbildung 2 mit Eclipse nach. Nutzen Sie dafür ein Ecore-Diagramm. Verwenden Sie anschließend das EMF Generator Model um den JavaQuelltext zu generieren. Erweitern Sie den generierten Java-Quelltext um folgende Funktionalität: Eine Testklasse, mittels der Benutzer Nachrichten über die Konsole im Format msg: <Nachrichtentext> eingeben können (in einer Schleife, bis er/sie das Programm beendet). 2 Abbildung 2: Klassendiagramm eines Facebook-Account Beobachters Dabei soll eine Benachrichtigung des Beobachters in der Konsole ausgegeben werden. Bitte beachten Sie, an allen Mehoden, die Sie geändert haben, die Annotation @generated zu entfernen oder durch @generated Not zu ersetzen. Alle Setter- und Getter-Methoden werden durch EMF standardmäßig mit generiert und brauchen somit nicht im Ecore-Diagramm mit modelliert werden. Bitte beachten Sie, die attach- und detach-Methode zu implementieren. 3.3 Erweitern Sie das Klassendiagramm um einen Observer FriendRequestObserver, der die Freundschaftsanfragen verfolgt, die bei dem beobachteten Facebook-Account eingehen. Generieren Sie wieder den Code und erweitern ihn, sodass der Benutzer Freundschaftsanfragen im Format friend:<RequesterName> in der Konsole eingeben kann. Falls nun eine neue Nachricht oder eine Freundschaftsanfrage eingeht, soll ausschließlich der zuständige Beobachter, MessageObserver bzw. FriendRequestObserver, eine Benachrichtigung über die Konsole ausgeben. Beschreiben sie zwei mögliche Umsetzungen und implementieren sie eine davon! 3.4 Betrachten Sie die von Java bereitgestellte abstrakte Klasse java.util.Observable und das Interface java.util.Observer. Wie hilft diese Implementierung bei der in Teilaufgabe 3.3 formulierten Problemstellung? 3