Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Design Pattern SS 15 Prof. Albert Zündorf

Ähnliche Präsentationen


Präsentation zum Thema: "Design Pattern SS 15 Prof. Albert Zündorf"—  Präsentation transkript:

1 Design Pattern SS 15 Prof. Albert Zündorf
Fachgebiet für Software Engineering Wilhelmshöher Allee Kassel (Raum 1339)

2 Organisatorisches Umfang: 4 SWS teils Vorlesungen teils Übungen
Übungsbetreuung: Marcel Hahn, … Ort und Zeit: Vorlesung: Dienstags 16: :00 Raum (Erste Vorlesung: ) Übung:? In obigem Zeitraum Prüfung: Pflichtübungsaufgaben (korrigiert, bepunktet) Folienskript / Screen Videos: Design Pattern SS © 2015 Albert Zündorf, University of Kassel

3 Literatur Elementar: Norbisrath, Zündorf, Jubeh: Story Driven Modeling, Amazon 2014, ISBN (Das Buch überhaupt ) Grundlegend: E. Gamma, R. Helm, R. Johnson, J. Vlissides: Design Patterns (Elements of Reusable Object-Oriented Software); Addison Wesley, Bonn, ISBN (1994) Patterns Home Page: st- Unified Modeling Language: Martin Hitz, Gerti Kappel: Work, dpunkt.verlag (ziemlich gut) Hintergrund: Frederick P.\ Brooks: The Mythical Man Month, Addison Wesley 1975 (ist nur kurz aber ziemlich witzig, unbedingt mal lesen) Design Pattern SS © 2015 Albert Zündorf, University of Kassel

4 Gliederung Einführung Design Grundprinzipien Grundlegende Pattern
Weitere Pattern Zusammenfassung Design Pattern SS © 2015 Albert Zündorf, University of Kassel

5 1. Einführung Ziele der Veranstaltung:
Design Know How für große Programme > LOC Grundprinzipien der Wartbarkeit und Erweiterbarkeit sicherer Umgang mit Vererbung und Delegation Grundkenntnis der wichtigsten Design Pattern Design Pattern SS © 2015 Albert Zündorf, University of Kassel

6 Beispiel Composite Pattern
Realisierung hierarchischer Datenstrukturen kommt in praktisch allen Software-Anwendungen vor naiver Ansatz verursacht dramatische Wartungsprobleme Gute Lösung ist Ausgangspunkt für viele weitere Pattern Design Pattern SS © 2015 Albert Zündorf, University of Kassel

7 Gliederung Einführung Design Grundprinzipien Grundlegende Pattern
Weitere Pattern Zusammenfassung Design Pattern SS © 2015 Albert Zündorf, University of Kassel

8 2. Design Grundprinzipien
Wartbarkeit Erweiterbarkeit ein Ort eine Design Entscheidung / eine Funktionalität  lokale Änderungen nur lokale Auswirkungen lokaler Änderung (Module/Klassen, Interfaces, Sichtbarkeiten) "wenig" Vererbung Design Pattern SS © 2015 Albert Zündorf, University of Kassel

9 Vererbung Substitutionsprinzip: Kinder müssen halten was die Eltern versprechen anstelle eines Elternklassenobjektes kann man auch immer ein Unterklassenobjekt verwenden has Employee work (t : Task) : Product Enterprise created does Task Product Manager work (t : Task) : Product manage ( proj : Project ) : Presentation Project Presentation Design Pattern SS © 2015 Albert Zündorf, University of Kassel

10 Beispielsituationen … prod = e.work (t); … :Employee :Task :Employee
Enterprise Employee work (t : Task) : Product Manager manage ( proj : Project ) : Presentation has Project Task Presentation Product created does Struktur Verhalten Daten … prod = e.work (t); … :Employee :Task :Employee :Task :Manager :Product :Project :Presentation Design Pattern SS © 2015 Albert Zündorf, University of Kassel

11 Beispielsituationen … prod = e.work (t); … :Employee :Task :Employee
Enterprise Employee work (t : Task) : Product Manager manage ( proj : Project ) : Presentation has Project Task Presentation Product created does Struktur Verhalten Daten … prod = e.work (t); … :Employee :Task :Employee :Task :Manager :Product :Project :Presentation Design Pattern SS © 2015 Albert Zündorf, University of Kassel

12 Beispielsituationen … prod = e.work (t); … :Employee :Task :Employee
Enterprise Employee work (t : Task) : Product Manager manage ( proj : Project ) : Presentation has Project Task Presentation Product created does Struktur Verhalten Daten … prod = e.work (t); … :Employee :Task :Employee :Task :Manager :Product :Project :Presentation Design Pattern SS © 2015 Albert Zündorf, University of Kassel

13 Beispielsituationen … prod = e.work (t); … :Employee :Task :Employee
Enterprise Employee work (t : Task) : Product Manager manage ( proj : Project ) : Presentation has Project Task Presentation Product created does Struktur Verhalten Daten … prod = e.work (t); … :Employee :Task :Employee :Task :Manager :Product :Project :Presentation Design Pattern SS © 2015 Albert Zündorf, University of Kassel

14 Co- und Contravariante Redefinitionen:
wegen Substituierbarkeit: input Parameter (Lesen) in Unterklassen nur verallgemeinern (Contravariante Redefinition) output Parametern (Schreiben in Unterklassen) nur spezialisieren (Covariante Redefinition) Design Pattern SS © 2015 Albert Zündorf, University of Kassel

15 Delegation: alarmDevice :FlashLight … this.alarm(); … :House :Sirene
run () alarm () FlashLight alarm() Sirene alarm() MailAlarm alarm() Struktur Verhalten Daten :FlashLight … this.alarm(); … :House :Sirene :MailAlarm Design Pattern SS © 2015 Albert Zündorf, University of Kassel

16 Hausaufgabe 1: deliveryBoy :CarBoy :CourierService :BikeBoy :RollerBoy
deliver(package, address) DeliveryBoy deliver(pack, addr) deliver(pack, addr) CarBoy BikeBoy deliver(pack, addr) RollerBoy deliver(pack, addr) Struktur Verhalten Daten :CarBoy … myCourier.deliver(p1, "WilliAllee73"); … :CourierService :BikeBoy :RollerBoy Design Pattern SS © 2015 Albert Zündorf, University of Kassel

17 Hausaufgabe 1: Implementiert obiges Klassendiagramm zur Delegation (z.B. mit SDMLib) Implementiert die deliver(pack, addr) Methoden der DeliveryBoy–Unterklassen macht jeweils unterschiedliche System.out Ausgaben Schreibt ein Testprogramm dass: ein CourierService Objekt und ein Paket Kaffebohnen erzeugt, nacheinander verschiedene DeliveryBoy Objekte einbaut jeweils deliver(coffeeBeans, "WilliAlle73") aufruft Design Pattern SS © 2015 Albert Zündorf, University of Kassel

18 Abgabe: Bis Eclipse Projekt "DPH01<matrnr>"
Eclipse Projekte inklusive Quellcode JUnit Test start mit einem Click Design Pattern SS © 2015 Albert Zündorf, University of Kassel

19 Vererbungskonzepte Design Pattern SS © 2015 Albert Zündorf, University of Kassel

20 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

21 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

22 Gliederung Einführung Design Grundprinzipien Grundlegende Pattern
Weitere Pattern Zusammenfassung Design Pattern SS © 2015 Albert Zündorf, University of Kassel

23 1. Referenzarchitektur interaktive System
QVT (Control) Generators / Interpreters GUI (Commands) Data Model GUI (Unparsing) Import/ Export Repository Design Pattern SS © 2015 Albert Zündorf, University of Kassel

24 Datenmodell mit Composite Pattern: naiv
Struktur Verhalten Daten Design Pattern SS © 2015 Albert Zündorf, University of Kassel

25 Datenmodell mit Composite Pattern: besser
Struktur Verhalten Daten Design Pattern SS © 2015 Albert Zündorf, University of Kassel

26 Datenmodell mit Composite Pattern: gut
Struktur Verhalten Daten Design Pattern SS © 2015 Albert Zündorf, University of Kassel

27 Hausaufgabe 2: Ein Book besteht aus: Parts Chapters Sections
Paragraphs Sentences Implementiert ein Datenmodell für Books mit dem Composite Pattern Lest die Kapitelstruktur des Buches ein. zählt die Anzahl der Objekte in euerer Composite Struktur macht euch für weitere Anforderungen bereit Design Pattern SS © 2015 Albert Zündorf, University of Kassel

28 Composite Pattern Problem:
Struktur Verhalten Daten Design Pattern SS © 2015 Albert Zündorf, University of Kassel

29 Naiver Ansatz: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

30 Visitor Pattern rekursiver Durchlauf durch Composite Struktur
durchreichen eines Visitor Objekts uniformerer Umgang mit Rekursionsparametern Trennung von Durchlauf und Aktion Design Pattern SS © 2015 Albert Zündorf, University of Kassel

31 Visitor Pattern Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

32 Visitor Pattern mit Reflection
Struktur Verhalten Daten Design Pattern SS © 2015 Albert Zündorf, University of Kassel

33 Visitor Pattern Zusammenfassung
Ziemlich viele accept und visit Methoden Double Dispatch möglich Seperation of concern Zustandsobjekt in der Rekursion Design Pattern SS © 2015 Albert Zündorf, University of Kassel

34 Hausaufgabe 3: Design Pattern SS © 2015 Albert Zündorf, University of Kassel

35 Strategy Pattern ersetze if-then-else-if Ketten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

36 If-then-else-if Kette:
Player main () doMove() mode : int Struktur Verhalten Daten public void doMove () { if (mode == AGGRESSIVE) { …} else if (mode == DEFEND) { …} else if (mode == PLAN) { …} … Design Pattern SS © 2015 Albert Zündorf, University of Kassel

37 Strategy Pattern: strategy 0..1 :Player :AttackStrat class Player{
main() doMove () MoveStrategy doMove() strategy 0..1 AttackStrat doMove() DefensiveStrat doMove() AStarStrat doMove() Struktur Verhalten Daten :Player :AttackStrat class Player{ public void doMove () { strategy.doMove (); } :DefensiveStrat :AStarStrat Design Pattern SS © 2015 Albert Zündorf, University of Kassel

38 Strategy Pattern Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

39 Hook Pattern (nicht im Gof-Buch)
zusätzliches Verhalten nachträglich einbauen Design Pattern SS © 2015 Albert Zündorf, University of Kassel

40 Hook Pattern: strategies n
Player main() doMove () StrategyPart doMove() strategies n AttackStrat doMove() DefensiveStrat doMove() ResearchStrat doMove() Struktur Verhalten Daten public void doMove() { produceFood(); for (strat in strategies) { strat.doMove(); } } :Player :AttackStrat :DefensiveStrat : ResearchStrat Design Pattern SS © 2015 Albert Zündorf, University of Kassel

41 Chain of Responsibility
im wesentlichen Hook aber Abbruch wenn erfolgreich bearbeitet Design Pattern SS © 2015 Albert Zündorf, University of Kassel

42 Chain of Responsibility, original
< next Player main() doMove () StrategyPart doMove() next 1 AttackStrat doMove() DefensiveStrat doMove() ResearchStrat doMove() Struktur Verhalten Daten class Player{ public boolean doMove () { if (next != null) { return next.doMove(); } return false; } } :Player :AttackStrat :DefensiveStrat : ResearchStrat Design Pattern SS © 2015 Albert Zündorf, University of Kassel

43 Chain of Responsibility, original :
next Player main() doMove () StrategyPart doMove() next 1 AttackStrat doMove() DefensiveStrat doMove() ResearchStrat doMove() Struktur Verhalten Daten class AttackStrat{ public boolean doMove () { // try it if (canAttack ()) { doAttack (); return true; } else { super.ring (); } } } :Player :AttackStrat :DefensiveStrat : ResearchStrat Design Pattern SS © 2015 Albert Zündorf, University of Kassel

44 Chain of Responsibility, besser debugbar:
Player main() doMove () StrategyPart doMove() handlers {ordered} n AttackStrat doMove() DefensiveStrat doMove() ResearchStrat doMove() Struktur Verhalten Daten class Player{ public boolean doMove () { boolean success = false; for (h in handlers) { success = h.doMove(); if (success) return true; } return false; } } handlers[1] :Player :AttackStrat handlers[2] :DefensiveStrat handlers[3] : ResearchStrat Design Pattern SS © 2015 Albert Zündorf, University of Kassel

45 Chain of Responsibility, besser debugbar:
Player main() doMove () StrategyPart doMove() handlers {ordered} n AttackStrat doMove() DefensiveStrat doMove() ResearchStrat doMove() Struktur Verhalten Daten class AttackStrat { public boolean doMove() { // try it if (canAttack ()) { doAttack (); return true; } else { return false; } } } handlers[1] :Player :AttackStrat handlers[2] :DefensiveStrat handlers[3] : ResearchStrat Design Pattern SS © 2015 Albert Zündorf, University of Kassel

46 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

47 Beobachtungen typische Kombinationen von Assoc und Vererbung
Unterklassen haben KEINE neue Methoden Unterklassen redefinieren geerbte Methoden Design Pattern SS © 2015 Albert Zündorf, University of Kassel

48 Beobachtungen Design Pattern SS © 2015 Albert Zündorf, University of Kassel

49 Hausaufgabe 4: Design Pattern SS © 2015 Albert Zündorf, University of Kassel

50 State im wesentlichen Strategy
aber systematische Strategy-Änderung nach Benutzung meist Implementierung von Statecharts Design Pattern SS © 2015 Albert Zündorf, University of Kassel

51 State: red yellow green timerTick() / car.stop()
TraficLight state :Integer timerTick() Car timerTick() / car.setPos(…) car yellow timerTick() / car.stop() green Struktur Verhalten Daten class TrafficLigth { void timerTick() { if (state == RED) { car.setPos (…); state = GREEN; } else if (state == GREEN) { car.stop(); state == YELLOW; } else if (state == YELLOW) car.stop() state = RED; } } } Design Pattern SS © 2015 Albert Zündorf, University of Kassel

52 State: Red TraficLight timerTick() Car current car Yellow TLState name states Green Struktur Verhalten Daten class Red { void timerTick() { owner.current = owner.states["green"]; car.setPos(…); } } class Green { void timerTick() { owner.current = owner.states["yellow"]; car.stop(); } } :Car :Red car states["red"] states["yellow"] :Yellow :TrafficLight :Green states["green"] Design Pattern SS © 2015 Albert Zündorf, University of Kassel

53 Listener/Observer/Model-View-Controler/Mediator
im wesentlichen Hook aber Einsatz zur Überwachung von Änderungen Design Pattern SS © 2015 Albert Zündorf, University of Kassel

54 Listener/Observer/Model-View-Controler
File size :Integer write(bytes[]) Listener/Observer/Model-View-Controler listeners n Listener propertyChange (obj, attrName, oldVal, newVal) Drive usedSpace :Integer propertyChange (obj, attrName, oldVal, newVal) Struktur Verhalten Daten class File { void write (bytes[]) { … this.setSize (size+bytes.length()); } void setSize (newVal) { if (this.size != newVal) { int oldVal = size; size = newVal; firePropertyChange ("size", oldVal, newVal); } } … :File size = 23 write ("aaaa") :Drive usedSpace = 38 :File size = 15 Design Pattern SS © 2015 Albert Zündorf, University of Kassel

55 Listener/Observer/Model-View-Controler
File size :Integer write(bytes[]) Listener/Observer/Model-View-Controler listeners n Listener propertyChange (obj, attrName, oldVal, newVal) Drive usedSpace :Integer propertyChange (obj, attrName, oldVal, newVal) Struktur Verhalten Daten class File { … void firePropertyChange (attrName, oldVal, newVal){ for (l in listeners) { l.propertyChange (this,attrName,oldVal,newVal); } } … :File size = 23 write ("aaaa") :Drive usedSpace = 38 :File size = 15 Design Pattern SS © 2015 Albert Zündorf, University of Kassel

56 Listener/Observer/Model-View-Controler
File size :Integer write(bytes[]) Listener/Observer/Model-View-Controler listeners n Listener propertyChange (obj, attrName, oldVal, newVal) Drive usedSpace :Integer propertyChange (obj, attrName, oldVal, newVal) Struktur Verhalten Daten class Drive { … void propertyChange (obj,attrName,oldVal,newVal){ usedSpace += newVal – oldVal; } } :File size = 23 write ("aaaa") :Drive usedSpace = 38 :File size = 15 Design Pattern SS © 2015 Albert Zündorf, University of Kassel

57 MVC :SpaceUpdater Drive File Computer usedSpace :Integer size :Integer
write(bytes[]) MVC Computer n targets listeners n Listener propertyChange (obj, attrName, oldVal, newVal) SpaceUpdater propertyChange (obj, attrName, oldVal, newVal) Struktur Verhalten Daten class SpaceUpdater { … void propertyChange (obj,attrName,oldVal,newVal){ for (t : targets) { t.usedSpace += newVal – oldVal; } } :File size = 23 write ("aaaa") :SpaceUpdater :File size = 15 :Drive usedSpace = 38 Design Pattern SS © 2015 Albert Zündorf, University of Kassel

58 while (parent != null) { parent.usedSpace += newVal – oldVal;
File size :Integer write(bytes[]) Dir usedSpace :Integer Drive n parent files 1 Computer listeners n Listener propertyChange (obj, attrName, oldVal, newVal) SpaceUpdater propertyChange (obj, attrName, oldVal, newVal) Struktur Verhalten Daten :Drive usedSpace = 38 :Computer usedSpace = 38 class SpaceUpdater { … void propertyChange (obj,attrName,oldVal,newVal) { Dir parent = obj.getParent(); while (parent != null) { parent.usedSpace += newVal – oldVal; parent = parent.getParent(); } } :Dir usedSpace = 38 :Dir usedSpace = 38 :SpaceUpdater write ("aaaa") :File size = 15 :File size = 23 Design Pattern SS © 2015 Albert Zündorf, University of Kassel

59 Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

60 Hausaufgabe 5?: Design Pattern SS © 2015 Albert Zündorf, University of Kassel

61 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

62 Template Method Motivation ähnlich wie Hook
aber feste Vorgabe von abstrakten Template-Methoden alle Template-Methoden müssen überschrieben werden Design Pattern SS © 2015 Albert Zündorf, University of Kassel

63 Template Method: :FlashLight
Alarm + ring () ~ start () ~ stop () FlashLight Sirene ring () MailAlarm ring () ~ start () ~ stop () ~ start () ~ stop () ~ start () ~ stop () Struktur Verhalten Daten :FlashLight class Alarm { void ring () { start (); … stop (); … } } :Sirene :MailAlarm Design Pattern SS © 2015 Albert Zündorf, University of Kassel

64 Template Method: :FlashLight
Alarm + ring () ~ start () ~ stop () FlashLight Sirene ring () MailAlarm ring () ~ start () ~ stop () ~ start () ~ stop () ~ start () ~ stop () Struktur Verhalten Daten :FlashLight class FlashLigth { void start () { powerOn (); } void stop () { powerOff () } } :Sirene :MailAlarm Design Pattern SS © 2015 Albert Zündorf, University of Kassel

65 Decorator ähnlich wie Composite mit nur einem Kind
ähnlich wie Chain-of-Responsibility erweitere eine Strategy um zusätzliche Aktionen Design Pattern SS © 2015 Albert Zündorf, University of Kassel

66 Decorator: alarm 0..1 :House
run () ring () Alarm ring () 0..1 orig alarm FlashLight ring () Sirene ring () MailAlarm ring () Struktur Verhalten Daten :House class MailAlarm { ring () { sendMail(); orig.ring(); } } :Sirene :MailAlarm Design Pattern SS © 2015 Albert Zündorf, University of Kassel

67 Proxy ähnlich wie Decorator aber kein Zusatzeffekt
sondern remote, lazy oder cache Effekte Design Pattern SS © 2015 Albert Zündorf, University of Kassel

68 Proxy: :House :Sirene :MailAlarm Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

69 Adapter ähnlich wie Decorator aber Schnittstellenanpassung
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

70 Adapter: :House :Sirene :MailAlarm Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

71 Hausaufgabe: Design Pattern SS © 2015 Albert Zündorf, University of Kassel

72 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

73 Flyweight Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

74 Flyweight Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

75 Interpreter / Macro / Command
Struktur Verhalten Daten Design Pattern SS © 2015 Albert Zündorf, University of Kassel

76 Command Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

77 Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

78 Hausaufgabe: Command Design Pattern SS © 2015 Albert Zündorf, University of Kassel

79 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

80 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

81 Factory Method: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

82 Prototype: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

83 Komplexer Prototyp Design Pattern SS © 2015 Albert Zündorf, University of Kassel

84 Abstract Factory: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

85 Hausaufgabe: Design Pattern SS © 2015 Albert Zündorf, University of Kassel

86 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

87 Facade: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

88 Facade: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

89 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

90 Plugins: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

91 Import Umkehrung: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

92 Import Umkehrung: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

93 Daten Plugin: Struktur Verhalten Daten
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

94 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

95 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

96 Reuse Architekturen: Bibliotheken Frameworks Plugin Architekturen
Software Bus / ECMA Toaster Corba / RMI / REST Component & Connector Android Intents Product Line Architecture Design Pattern SS © 2015 Albert Zündorf, University of Kassel

97 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

98 Components & Connectors Architekturen
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

99 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

100 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel

101 Components & Connectors Architekturen
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

102 Components & Connectors Architekturen
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

103 Components & Connectors Architekturen
Design Pattern SS © 2015 Albert Zündorf, University of Kassel

104 Wie erreicht man: Wartbarkeit Erweiterbarkeit Qualität Produktivität
Sicherheit Robustheit Usability Skalierbarkeit Verfügbarkeit Design Pattern SS © 2015 Albert Zündorf, University of Kassel

105 Design Pattern SS2015 © 2015 Albert Zündorf, University of Kassel


Herunterladen ppt "Design Pattern SS 15 Prof. Albert Zündorf"

Ähnliche Präsentationen


Google-Anzeigen