6. Objektorientiertes Design



Ähnliche Dokumente
Objektorientierte Software-Entwicklung

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

GUI Programmierung mit JAVA Swing

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

Ereignisbehandlung 21

GRAFISCHE BENUTZERSCHNITTSTELLEN

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

Swing Lernen am Code Teil 1

Objektorientierte Programmierung

Grundlagen der Programmierung APPLETS

Grafische Benutzeroberflächen mit Swing

Design Patterns 2. Model-View-Controller in der Praxis

Das Model View Controller (MVC) Konzept

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Objektorientierte Softwareentwicklung

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Vermittler (Mediator) Sabine Müller - Sven Richter - Jens Wagenbreth 03IN2-P-D

Einführung in die Programmierung

Java Einführung Collections

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Programmieren in Java

tentoinfinity Apps 1.0 EINFÜHRUNG

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Dokumentation des Projektes Tic Tac Toe

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Delegatesund Ereignisse

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

8 Design Patterns. Events

Ein wichtiges Konzept der Software-Architektur

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

U08 Entwurfsmuster (II)

ID VisitControl. Dokumentation Equitania Software GmbH cmc Gruppe Seite 1

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Prinzipien Objektorientierter Programmierung

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Software Engineering Klassendiagramme Assoziationen

2A Basistechniken: Weitere Aufgaben

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Mobile-Szenario in der Integrationskomponente einrichten

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Lehrer: Einschreibemethoden

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Objektorientierte Programmierung. Kapitel 12: Interfaces

Kostenstellen verwalten. Tipps & Tricks

Windows Presentation Foundation (WPF) -Grundlagen -Steuerelemente. Dr. Beatrice Amrhein

1. Bearbeite Host Netzgruppen

Übungen zur Softwaretechnik

BENUTZERHANDBUCH für. Inhaltsverzeichnis. 1. Anmeldung. 2. Rangliste ansehen. 3. Platzreservierung. 4. Forderungen anzeigen

5.2 Neue Projekte erstellen

Partnerportal Installateure Registrierung

Whitepaper. Produkt: combit Relationship Manager / address manager. Dateiabgleich im Netzwerk über Offlinedateien

Hochschule der Medien Prof. Uwe Schulz 14. Juli 2010 Klausur Informatik, EDV-Nr Seite 1 von 5. Teil 2: Aufgaben

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Programmieren 2 07 JavaFX-Properties und Data-Binding

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Einführung in die Java- Programmierung

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

5 Projekt Bankverwaltung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Microsoft Update Windows Update

Objektorientierte Programmierung

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Der große VideoClip- Wettbewerb von Media Markt.

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Objektorientierte Programmierung

OS Anwendungsbeschreibung

Einstieg in die Informatik mit Java

Eine Anwendung mit InstantRails 1.7

Java: Vererbung. Teil 3: super()

Java Lab 2006/12/13 Client

Seriendruck mit der Codex-Software

Wie gestaltet man Online-Umfragen mit SurveyMonkey?

Benutzeroberflächen. Java Teil 4

Datenaustausch mit dem BVK Data Room

HSR git und subversion HowTo

1. Loggen Sie sich mit Ihrem Benutzernamen in den Hosting-Manager (Confixx) auf Ihrer entsprechenden AREA ein.

Programmierkurs Java

FlowFact Alle Versionen

BSV Software Support Mobile Portal (SMP) Stand

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

SEP 114. Design by Contract

DOKUMENTATION VOGELZUCHT 2015 PLUS

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Tipps und Tricks zu Netop Vision und Vision Pro

Ihr CMS für die eigene Facebook Page - 1

6 Zusammenarbeits-Funktionen (Collaboration)

Drucken, GUI, Design Pattern,... PDF, Usability, Observer Pattern, MVC

Leitfaden zur Installation von Bitbyters.WinShutdown

Tel.: Fax: Ein Text oder Programm in einem Editor schreiben und zu ClassPad übertragen.

Transkript:

6. Objektorientiertes Design 6.1 Entwurfsmuster 6.2 Zusammenfassendes Beispiel 6.3 Umsetzung des Model-View-Controller- Musters in Java 6. Objektorientiertes Design 6-1

Grundlage des objektorientierten Designs Das objektorientierte Design besteht im Wesentlichen aus dem Abbilden des in der OO-Analyse gewonnenen Modells auf softwaretechnische Klassen. Typische Klassen sind Klassen, die Hardware- und Software-Ressourcen repräsentieren GUI-Klassen, insbesondere für die Erstellung von Fenster-Oberflächen Middleware-Klassen Abstrakte Klassen Interface-Klassen Behälterklassen (Container, Collections) und viele mehr. 6. Objektorientiertes Design 6-2

Beispiel für eine Datenbankanwendung Abb 6.1 aus Bannert / Weitzel Viele dieser Klassen werden Klassenbibliotheken oder Frameworks entnommen und brauchen nicht selbst implementiert zu werden. Das ist ein wesentlicher Unterschied zum konventionellen Software- Engineering. 6. Objektorientiertes Design 6-3

6.1 Entwurfsmuster Neuere Arbeiten zum objektorientierten Design schlagen die Einführung von Entwurfsmustern (design patterns) vor. Die Idee ist dabei, dass man in der Softwareentwicklung immer wieder ähnlich geartete Probleme löst. Entwurfsmuster sind also verallgemeinerte Problemlösungskonzepte. Es sind keine Klassenbibliotheken. Im Zusammenhang mit Entwurfsmustern ist die Trennung zwischen Schnittstelle (Interface) und Implementierung sinnvoll. Eine solche Trennung kann in Java durch abstrakte Klassen und durch Interface- Klassen erfolgen. 6. Objektorientiertes Design 6-4

Interface-Klassen Eine Interface-Klasse in Java enthält nur die Deklaration der Methoden, nicht ihre Implementierung. 6. Objektorientiertes Design 6-5

Model View Controller (1) Model-View-Controller ist ein wichtiges und in der Praxis oft nützliches Entwurfsmuster. 6. Objektorientiertes Design 6-6

Model View Controller (2) Model Im Model ist die Anwendungslogik enthalten. Es beschreibt das Systemmodell und sein gesamtes immanentes Verhalten. View In der View ist die Repräsentation des Zustandes des Modells und seiner Ausgaben gegenüber dem Benutzer zusammen gefasst. Controller Der Controller implementiert die Interaktion mit dem Benutzer, nimmt seine Eingaben entgegen. Die saubere Trennung dieser drei Komponenten hat den Vorteil, dass man eine Einzelne leicht neu implementieren kann, ohne dass die anderen betroffen sind. 6. Objektorientiertes Design 6-7

Das Beobachtermuster (1) Das Beobachtermuster stellt eine Kopplung zwischen Beobachtern (View-Objekten) her, die ein observierbares Objekt beobachten. Das beobachtbare Objekt stellt folgende Methoden zur Verfügung: Anmelden Abmelden Zustand abfragen Zustand setzen Die Beobachter haben eine Aktualisierungsmethode, die vom beobachtbaren Objekt aufgerufen wird, wenn sich im beobachteten Objekt etwas ändert. 6. Objektorientiertes Design 6-8

Das Beobachtermuster (2) Die Struktur des Beobachter-Musters 6. Objektorientiertes Design 6-9

Interaktionsdiagramm des Beobachtermusters 6. Objektorientiertes Design 6-10

Das Kompositum Das Kompositum ist ein Entwurfsmuster, das Rekursion zulässt. Es beschreibt Komponenten, die andere Komponenten enthalten können. Beispiel: Das Unix-Dateisystem 6. Objektorientiertes Design 6-11

6.2 Zusammenfassendes Beispiel Reservierung von Räumen für Lehrveranstaltungen Use-Cases für das Raumreservierungsbeispiel 6. Objektorientiertes Design 6-12

Fachklassen für das Raumreservierungsbeispiel 6. Objektorientiertes Design 6-13

Beziehungen zwischen den Klassen des Raumreservierungsbeispiels 6. Objektorientiertes Design 6-14

RMI-Klassen für die Verteilung Basisklassen für die Verteilung über RMI hinzu fügen 6. Objektorientiertes Design 6-15

6.3 Umsetzung des Model-View- Controller-Musters in Java 6. Objektorientiertes Design 6-16

Model - Delegate-Architektur 1/2 Model View Controller Swing implementiert die Model-Delegate-Architektur. Jedes Dialogelement von Swing (component) gliedert sich in das Modell (model) und die Benutzerschnittstelle (UI delegate). Innerhalb der Benutzerschnittstelle kann man die Anteile der Benutzeroberfläche (view) und der Anwendungssteuerung (controller) wiederfinden. Bei dieser Strukturierung verläuft die Kommunikation zwischen den Komponenten etwas anders als bei dem MVC-Modell: Es erfolgt eine Synchronisation des Zustandes des Modells und des Zustandes der Benutzerschnittstelle, die wahlweise von beiden Seiten ausgelöst werden kann. 6. Objektorientiertes Design 6-17

Model - Delegate Architektur 2/2 Model View Controller Delegate Dafür werden statechanged-events verwendet. Ferner erfolgt ein direkter Abgleich von Controller und View durch andere Ereignisse, die von der jeweiligen Art des Dialogelements abhängig sind. Diese Struktur weist eine Reihe von Vorteilen auf: Sie bindet die Callback- Funktionen der Anwendungssteuerungskomponente enger an das jeweilige Dialogelement. Es hat sich nämlich herausgestellt, daß das Wiederverwenden von Callback- Funktionen in unterschiedlichen Kontexten nur ganz selten möglich ist. (Beispiele dafür sind: Beenden einer Anwendung, Schließen aller Fenster, aber das war es meist auch schon.) 6. Objektorientiertes Design 6-18

Kommunikation zwischen Model und Delegate in Java Bisher kennen wir lediglich Methodenaufrufe als Kommunikationsinstrument zwischen zwei Objekten. Wollte nun ein Delegate das Model bspw. darüber informieren, daß ein bestimmter Button gedrückt wurde, müßte es wissen, welche Methode welchen Model-Objektes zur Behandlung dieses Ereignisses notwendig ist. Unter Umständen müßten mehrere Model-Objekte mit unterschiedlichen Interfaces informiert werden. Zur Vereinfachung dieses Problems implementiert Java das Observer - Observable Muster. 6. Objektorientiertes Design 6-19

Observer - Observable Muster Dieses Muster realisiert eine 1:n Verknüpfung zwischen einem Objekt (Observable) und weiteren davon abhängigen Objekten (Observers). Eine Zustandsänderung des Objektes hat dabei automatisch eine Benachrichtigung der anderen Objekte zur Folge. Die Verknüpfung zwischen Observable und Observers kann unter anderem über das Ereignis-Konzept erfolgen. Ok-Button okbutton.addactionlistener(this); okbutton Event e listener1 listener2 listener3 Listener3.actionPerformed(e); 6. Objektorientiertes Design 6-20

Ereigniskonzept Wesentliche Begriffe in der Programmierung von Benutzeroberflächen mit Swing sind die Begriffe: Component, Event und EventListener. Unter Components werden Objekte verstanden, die GUI-Elemente (Widgets) repräsentieren. Ein Beispiel für ein Widget ist ein Button. Interagiert der Benutzer mit einem Widget, erzeugt dieses Events. Verschiedene Benutzerinteraktionen lösen verschiedene Events aus. Jede Component verwaltet Listen von EventListeners für verschiedene Event- Typen. Ein EventListener ist ein Objekt, das sich für ein Event eines bestimmten Typs interessiert. Um Events einer bestimmten Component zu empfangen, muß sich dieses bei der Component anmelden. 6. Objektorientiertes Design 6-21

Überblick Components Auszug aus der Ableitungshierarchie der Swing Components: JComponent AbstractButton JList JScrollBar JButton JToggleButton JCheckBox JRadioButton Zur Registrierung von EventListenern verfügen Components über Methoden addxyzlistener(xyzlistener l); 6. Objektorientiertes Design 6-22

Beispiel JButton Objekte der Klasse JButton repräsentieren ein Button Widget. Dieses verwaltet eine Liste von ActionEventListener Objekten, die ein ActionEvent erhalten, wenn der Benutzer den Button klickt. class JButton extends AbstractButton { public void addactionlistener(actionlistener l); } 6. Objektorientiertes Design 6-23

Beispiel ActionEventListener Das Drücken eines Buttons löst ein Ereignis vom Typ ActionEvent aus. ActionEvents können von ActionListener Objekten verarbeitet werden. interface ActionListener extends EventListener { public void actionperformed(actionevent e); }; 6. Objektorientiertes Design 6-24

Beispiel Anwendung Nachfolgender Codeauszug zeigt, wie ein Objekt aus dem Problembereich mit einem Delegate verbunden wird. class ButtonCtrl implements ActionListener { public void actionperformed(actionevent e) { System.out.println( ok. ); } } public class MyClass { ButtonCtrl bl; public static void main() { bl = new ButtonCtrl(); } } MyClass myclass= new MyClass(); JButton b = new JButton( Ok ); b.addactionlistener(bl); 6. Objektorientiertes Design 6-25

Beispiel: PlayerList Erstellung eines Dialogfensters zur: Anzeige der Einträge und der Grösse einer Spielerliste und Eingabe von weiteren Spielernamen 6. Objektorientiertes Design 6-26

Komponenten des Beispiels Modell Das Datenmodell umfasst eine Liste in der die Spielernamen gespeichert werden. View 1 Innerhalb der ersten Ansicht wird die Liste der eingetragenen Spielernamen angezeigt. View 2 Die zweite Ansicht umfasst die Anzeige der aktuellen Grösse der Spielerliste. Controller Die Benutzereingaben werden über das Textfeld angenommen und entsprechend ausgewertet. 6. Objektorientiertes Design 6-27

Klassendiagramm 6. Objektorientiertes Design 6-28

Sequenzdiagramm Ereignisfolge beim Einfügen eines neuen Spielernamens: 6. Objektorientiertes Design 6-29

Implementierung der Views (1) Allgemeiner Listener für Änderungen der Spielerliste: public interface PlayerListChangeListener { // this method is called when the player list changes public void statechanged(); } 6. Objektorientiertes Design 6-30

Implementierung der Views (2) Ansicht zur Anzeige der Listengrösse: public class PlayerListSizeView extends JPanel implements PlayerListChangeListener { // the observable PlayerList playerlist; // the label that shows the size JLabel label = new JLabel(); public PlayerListSizeView(PlayerList playerlist) { this.playerlist = playerlist; // set the Swing component add(label); } // update the label statechanged(); } public void statechanged() { label.settext("player list size : " + playerlist.getsize()); } 6. Objektorientiertes Design 6-31

Implementierung der Views (3) Ansicht zur Anzeige der Spielernamen: public class PlayerListView extends JPanel implements PlayerListChangeListener { JList list = new JList(new DefaultListModel()); // player list that is observed PlayerList playerlist; // construction public PlayerListView(PlayerList playerlist) { // set the observable this.playerlist = playerlist; setlayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // set the Swing components add(new JLabel("Player list")); JScrollPane scrollpane = new JScrollPane(list); add(scrollpane); } // update the JList statechanged(); 6. Objektorientiertes Design 6-32

Implementierung der Views (4) Ansicht zur Anzeige der Spielernamen (Fortsetzung): public void statechanged() { // get the current list model DefaultListModel dlm = (DefaultListModel) list.getmodel(); // and clear all entries dlm.clear(); // get all names from the observer player list ListIterator it = playerlist.getlist().listiterator(); while (it.hasnext()) { Player current = (Player) it.next(); // add them to the list model dlm.addelement(current.getname()); } } } // class PlayerListView 6. Objektorientiertes Design 6-33

Implementierung des Modells Verwaltung der Spielernamen: public class PlayerList { private ArrayList playerlist = new ArrayList(); private ArrayList changelistener = new ArrayList(); public void add(player p) { playerlist.add(p); // notify listeners firechange(); } public ArrayList getlist() { return playerlist; } public int getsize() { return playerlist.size(); } public void firechange() { // notify all listeners that the player list has changed ListIterator it = changelistener.listiterator(); while (it.hasnext()) { PlayerListChangeListener current = (PlayerListChangeListener) it.next(); current.statechanged(); } } } public void addchangelistener(playerlistchangelistener c) { changelistener.add(c); } 6. Objektorientiertes Design 6-34

Integration der Komponenten (1) Erzeugung des Hauptfensters: public class Main { // the data model static PlayerList playerlist = new PlayerList(); // the input field for adding new players static JTextField textfield = new JTextField(); public static void main(string[] args) { // create the application window JFrame mainframe = new JFrame(); Container c = mainframe.getcontentpane(); c.setlayout(new FlowLayout());... 6. Objektorientiertes Design 6-35

Integration der Komponenten (2) Erzeugung der Views: /* ---- create views ---- */ // create the first view... PlayerListView plv = new PlayerListView(playerList); //... and add it to the listener list of the model playerlist.addchangelistener(plv); // create the second view... PlayerListSizeView plsv = new PlayerListSizeView(playerList); //... and add it to the listener list of the model playerlist.addchangelistener(plsv); // integrate the views into the application frame JPanel viewpanel = new JPanel(); viewpanel.setborder(borderfactory.createetchedborder()); viewpanel.setlayout(new BoxLayout(viewPanel, BoxLayout.Y_AXIS)); viewpanel.add(new JLabel("Views")); viewpanel.add(box.createverticalstrut(15)); viewpanel.add(plv); viewpanel.add(plsv); c.add(viewpanel); 6. Objektorientiertes Design 6-36

Integration der Komponenten (3) Erzeugung des Controllers: } } /* ---- create controller ---- */ // create the controller (textfield + ActionListener) textfield.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { playerlist.add(new Player(textField.getText())); textfield.settext(""); } }); // integrate the controller into the application frame JPanel controlpanel = new JPanel(); controlpanel.setborder(borderfactory.createetchedborder()); controlpanel.setlayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); controlpanel.add(new JLabel("Control")); controlpanel.add(box.createverticalstrut(15)); controlpanel.add(new JLabel("Enter player name:")); controlpanel.add(textfield); c.add(controlpanel); mainframe.pack(); mainframe.setvisible(true); 6. Objektorientiertes Design 6-37