Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität...

36
Medientechnik Sommersemester 2016 Übung 02 (MVC, Observer & Co.) Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02 - 1

Transcript of Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität...

Page 1: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Medientechnik Sommersemester 2016

Übung 02 (MVC, Observer & Co.)

Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02 - 1

Page 2: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Terminübersicht

Medientechnik SS 2016 - Übung 02 - 2 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Nr Zeitraum Thema

1 18.04. - 21.04. Organisatorisches, Bildbearbeitung

2 09.05. - 12.05. JavaFX Einführung (GUIs, Szenengraph)

3 17.05. - 19.05. Design Patterns: MVC, Observer

4 23.05. - 25.05. Bildfilter programmieren

5 30.05. - 02.06. Videobearbeitung

6 06.06. - 09.06. Video Streams mit JavaFX

7 20.06. - 23.06. Audiobearbeitung

8 27.06. - 30.06. Multimedia mit JavaFX

Page 3: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Agenda

• Wiederholung Übung 1

• Model-View Controller (MVC)

• EventHandler

• Observer Pattern

Medientechnik SS 2016 - Übung 02 - 3 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 4: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Yaca

• Letzte Übung: – GUI für sehr einfachen Taschenrechner

– Unterschiedliche Elemente mit Hilfe von Panes und Boxes

– Default Werte für einzelne Elemente setzen

• Source code jetzt online unter: http://www.medien.ifi.lmu.de/lehre/ss16/mt/uebung/ressourcen/mt_material02.zip

Medientechnik SS 2016 - Übung 02 - 4 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 5: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Warm-Up Quiz

• Was ist ein Szenengraph?

• Wofür braucht man “Container”?

• Was macht ein BorderPane?

• Was macht primaryStage.setScene(scene);?

• Welche Methode muss man aufrufen, damit die “Bühne” sichtbar wird?

Medientechnik SS 2016 - Übung 02 - 5 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 6: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Los geht’s!

1. Lieblings-Editor starten

2. Projekt der letzten Übung öffnen

3. Source Code evtl. übernehmen http://www.medien.ifi.lmu.de/lehre/ss16/mt/uebung/ressourcen/mt_material02.zip

Medientechnik SS 2016 - Übung 02 - 6 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 7: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model View Controller (MVC)

• Software Design Pattern (Entwurfsmuster) – Wiederverwendbare Lösung für bekannte Programmierprobleme

– Lediglich Beschreibung Implementierung muss man selbst machen

• “Separation of Concerns” – Flexibilität

– Komponenten leicht austauschbar

• Weitere Varianten haben sich entwickelt (Model-View-Presenter, Model-View-ViewModel und viele andere)

Medientechnik SS 2016 - Übung 02 - 7 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

https://en.wikipedia.org/wiki/Software_design_pattern

Page 8: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

MVC Komponenten

• Model: – Speichert Daten – Gibt Auskunft über aktuelle

Werte und notifiziert ggf.

• View: – “dumme Anzeige” – Wird vom Model

benachrichtigt, wenn neue Daten anzuzeigen sind

– Gibt Nutzereingaben erst mal an den Controller weiter

• Controller: – Legt das Verhalten des

Programms fest. – Kann Änderungen von Werten

im Model vornehmen.

Medientechnik SS 2016 - Übung 02 - 8 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

[http://java.sun.com]

Page 9: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model

import javafx.stage.Stage; public class Model { private Stage primaryStage = null; public Model (Stage primaryStage) { this.primaryStage = primaryStage; } public Stage getPrimaryStage() { return primaryStage; } }

Medientechnik SS 2016 - Übung 02 - 9 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Model.java

Page 10: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

YacaView

import … public class YacaView { public YacaView() { } public void show(Stage stage){ int padding = 5; double fieldWidth = 50; […] } }

Medientechnik SS 2016 - Übung 02 - 10 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

YacaView.java

Page 11: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Controller

public class Controller { private YacaView yacaView; private Model model; public Controller(Model model) { this.model = model; this.yacaView = new YacaView(); } public void showGUI(){ this.yacaView.show(this.model.getPrimaryStage()); } }

Medientechnik SS 2016 - Übung 02 - 11 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Controller.java

Page 12: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Main

import javafx.application.Application; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } public void start(Stage primaryStage) throws Exception { Model model = new Model(primaryStage); Controller controller = new Controller(model); controller.showGUI(); } }

Medientechnik SS 2016 - Übung 02 - 12 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Main.java

Page 13: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

MODEL Daten und Funktionalität kapseln und zur Verfügung stellen

Medientechnik SS 2016 - Übung 02 - 13 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 14: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model – Instanzvariablen für Werte

import [...] public class Model extends Observable { private Stage primaryStage = null; private double firstNumber, secondNumber, result; public Model(Stage primaryStage) { this.primaryStage = primaryStage; this.firstNumber = 0; this.secondNumber = 0; this.result = 0; } public Stage getPrimaryStage() { return primaryStage; } }

Medientechnik SS 2016 - Übung 02 - 14 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 15: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model – Methoden

public class Model { [...] public void calculateResult(){ //TODO } public void reset() { this.firstNumber = 0; this.secondNumber = 0; this.result = 0; } [...] }

Medientechnik SS 2016 - Übung 02 - 15 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 16: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model – Operatoren

public class Model { private Stage primaryStage = null; private String currentOperator = null; private ObservableList<String> operators = null; private double firstNumber, secondNumber, result; public Model(Stage primaryStage) { this.primaryStage = primaryStage; this.firstNumber = 0; this.secondNumber = 0; this.result = 0; this.operators = FXCollections.observableArrayList( "+", "-", "*", "/” ); this.currentOperator = "+"; } }

Medientechnik SS 2016 - Übung 02 - 16 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 17: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model – Getter/Setter

public class Model { [...] public ObservableList<String> getOperators() { return operators; } public double getFirstNumber() { return firstNumber; } public void setFirstNumber(double firstNumber) { this.firstNumber = firstNumber; } public double getSecondNumber() { return secondNumber; } public void setSecondNumber(double secondNumber) { this.secondNumber = secondNumber; } public void setCurrentOperator(String operator) { this.currentOperator = operator; } public Stage getPrimaryStage() { return primaryStage; } }

Medientechnik SS 2016 - Übung 02 - 17 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 18: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model – Ergebnis berechnen

public class Model { [...] public void calculateResult() { switch (this.currentOperator) { case "+": this.result = this.firstNumber + this.secondNumber; break; case "-": this.result = this.firstNumber - this.secondNumber; break; case "*": this.result = this.firstNumber * this.secondNumber; break; case "/": this.result = this.firstNumber / this.secondNumber; break; } } [...] }

Medientechnik SS 2016 - Übung 02 - 18 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 19: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

VIEW Anzeigen, Ereignisse weitergeben.

Medientechnik SS 2016 - Übung 02 - 19 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 20: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

YacaView – Instanziierung

public class YacaView { private TextField resultField; private TextField firstNumberField; private TextField secondNumberField; private Button calculateButton; private Button resetButton; private ComboBox<String> operatorBox; public YacaView() { this.firstNumberField = new TextField(); this.secondNumberField = new TextField(); this.resultField = new TextField(); this.calculateButton = new Button("Calculate!"); this.resetButton = new Button("Clear"); this.operatorBox = new ComboBox<String>(); } [...] }

Medientechnik SS 2016 - Übung 02 - 20 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

YacaView.java

Page 21: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

YacaView – Getter/Setter

public class YacaView { [...] public double getFirstValue() { return Double.parseDouble(this.firstNumberField.getText()); } public double getSecondValue() { return Double.parseDouble(this.secondNumberField.getText()); } public Button getCalculateButton() { return this.calculateButton; } public Button getResetButton() { return this.resetButton; } public ComboBox getOperatorBox() {return this.operatorBox; } // Setter! public void setOperators(ObservableList<String> operators) { this.operatorBox.setItems(operators); } }

Medientechnik SS 2016 - Übung 02 - 21 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 22: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Zwischenüberlegungen

• Zu diesem Zeitpunkt sind Model, View und Controller noch voneinander losgelöst

• Jetzt fehlen also noch diese Punkte: – View soll Nutzereingaben an den Controller weitergeben

– Controller soll auf solche Ereignisse reagieren

– Model soll die Berechnung ausführen

– View soll das Ergebnis anzeigen

Medientechnik SS 2016 - Übung 02 - 22 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 23: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

YacaView – Event Handling 1

public class YacaView { […] private EventHandler<ActionEvent> handler; public YacaView(EventHandler<ActionEvent> handler) { this.handler = handler; this.firstNumberField = new TextField(); this.secondNumberField = new TextField(); this.resultField = new TextField(); this.calculateButton = new Button("Calculate!"); this.resetButton = new Button("Clear"); this.operatorBox = new ComboBox<String>(); } }

Medientechnik SS 2016 - Übung 02 - 23 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 24: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

YacaView – Event Handling 2

public class YacaView { […] public void show(Stage stage){ […] this.calculateButton.setOnAction(this.handler); this.resetButton.setOnAction(this.handler); this.operatorBox.setOnAction(this.handler);

[…] } }

Medientechnik SS 2016 - Übung 02 - 24 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 25: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

CONTROLLER Ablaufsteuerung

Medientechnik SS 2016 - Übung 02 - 26 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 26: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Controller - Überlegungen

• Controller muss auf Ereignisse reagieren: Implementiert die Schnittstelle EventHandler<ActionEvent>

• Muss erkennen können, welches Event eingetreten ist “Quelle” des Ereignisses liefert Auskunft darüber

• Quelle der Ereignisse wird mit Instanzvariablen (Buttons, ComboBox) der YacaView verglichen und entsprechend reagiert.

Medientechnik SS 2016 - Übung 02 - 27 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 27: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Controller - EventHandler Schnittstelle

Medientechnik SS 2016 - Übung 02 - 28 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

import javafx.event.ActionEvent; import javafx.event.EventHandler; public class Controller implements EventHandler<ActionEvent> { private YacaView yacaView; private Model model; public Controller(Model model) { this.model = model; this.yacaView = new YacaView(this); } @Override public void handle(ActionEvent event) { // TODO } public void showGUI(){ this.yacaView.setOperators(this.model.getOperators()); this.yacaView.show(this.model.getPrimaryStage()); } }

Page 28: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Controller - handle Methode

Medientechnik SS 2016 - Übung 02 - 29 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

public class Controller implements EventHandler<ActionEvent> { […] public void handle(ActionEvent event) { Object source = event.getSource(); ComboBox operatorBox; if (source.equals(this.yacaView.getOperatorBox())) { operatorBox = (ComboBox) source; this.model.setCurrentOperator((String) operatorBox .getSelectionModel() .getSelectedItem()); } else if(source.equals(this.yacaView.getCalculateButton())){ this.model.setFirstNumber(this.yacaView.getFirstValue()); this.model.setSecondNumber(this.yacaView.getSecondValue()); this.model.calculateResult(); } else if(source.equals(this.yacaView.getResetButton())){ this.model.reset(); } } }

Page 29: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Ergebnis anzeigen?

• Aktuell: Das Model berechnet jetzt wie gewollt das Ergebnis.

• Nächster Schritt: Ergebnis anzeigen. Aber wie?

• 1. Ansatz: in der .handle() Methode noch auf das resultField von der YacaView zugreifen und den entsprechenden Wert setzen.

• 2. Ansatz: die YacaView “beobachtet” das Ergebnis und reagiert dann immer wenn es sich ändert

Medientechnik SS 2016 - Übung 02 - 30 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Observer Pattern!

Page 30: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

OBSERVER PATTERN Oh! Noch ein Design Pattern!

Medientechnik SS 2016 - Übung 02 - 31 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 31: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Wichtigste Komponenten

• java.util.Observable – Klasse, von der man Hilfsmethoden erben kann

– .setChanged() deutet an, dass sich das Observable in einem neuen Zustand befinden, der relevant für alle Observer sein könnte

– .notifyObservers() benachrichtigt alle, die sich für dieses Observable registriert haben.

• java.util.Observer – Schnittstelle, die das Beobachten eines Observable ermöglicht

– .update() Methode muss implementiert werden. Hier kann man auf Änderungen des Observables reagieren.

Medientechnik SS 2016 - Übung 02 - 32 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 32: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Model anpassen

import java.util.Observable; public class Model extends Observable{ […] public void calculateResult(){ switch (this.currentOperator) { […] } this.setChanged(); this.notifyObservers(this.result); } public void reset() { this.firstNumber = 0; this.secondNumber = 0; this.result = 0; this.setChanged(); this.notifyObservers("reset"); } }

Medientechnik SS 2016 - Übung 02 - 33 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 33: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

View anpassen

import java.util.Observable; import java.util.Observer; public class YacaView implements Observer{

[…]

public void update(Observable o, Object arg) { if(arg.equals("reset")) { this.secondNumberField.setText(String.valueOf(0)); this.firstNumberField.setText(String.valueOf(0)); this.resultField.setText(""); } else { this.resultField.setText(arg.toString()); } }

[…]

}

Medientechnik SS 2016 - Übung 02 - 34 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 34: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Controller anpassen

public class Controller implements EventHandler<ActionEvent> {

[…]

public void showGUI(){ this.yacaView.setOperators(this.model.getOperators()); this.yacaView.show(this.model.getPrimaryStage()); this.model.addObserver(this.yacaView); } }

Medientechnik SS 2016 - Übung 02 - 35 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 35: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

Wrap-Up Quiz

1. In welcher Klasse wird der Observer beim Modell registriert?

2. Welche Methode der Schnittstelle EventHandler muss man implementieren?

3. Wie wird ein EventHandler einem Element hinzugefügt?

4. Ist Observable eine Klasse oder eine Schnittstelle?

5. Welche beiden Methoden müssen aufgerufen werden, wenn sich etwas am Modell geändert hat?

6. Wann kann es zu einer NumberFormatException kommen?

7. Was bewirkt die folgende Zeile? Model m = (Model) someObject;

8. Warum wurden in unserem Beispiel die TextFelder der YacaView zu Instanzvariablen gemacht?

Medientechnik SS 2016 - Übung 02 - 36 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz

Page 36: Medientechnik SS16 Übung 2 - Medieninformatik• Observer Pattern Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz Medientechnik SS 2016 - Übung 02

WELCHE FRAGEN HABT IHR? Vielen Dank!

Medientechnik SS 2016 - Übung 02 - 37 Ludwig-Maximilians-Universität München - LFE Medieninformatik - Tobias Seitz