Design Patterns. En kort introduktion

Relevanta dokument
Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

DAT043 - Föreläsning 7

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Designmönster/Design patterns

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Föreläsning 2. Länkad lista och iterator

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Länkade strukturer. (del 2)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2016

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Akronymer. CD5130 OOP, fk. Mjukvarumönster. Mjukvarumönster. Mjukvarumönster, forts. Mjukvarumönster, forts

Tentamen. DD2385 Programutvecklingsteknik vt 2015 Fredagen den 5 juni 2015 kl Hjälpmedel: penna, suddgummi, linjal

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Föreläsning 2. Länkad lista och iterator

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

DAT043 - föreläsning 8

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 4 Innehåll

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Datastrukturer. föreläsning 3. Stacks 1

OOP Objekt-orienterad programmering

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Lösningar till tentamen i EDAF25

OOP Objekt-orienterad programmering

Objektorienterad programmering med Java, Generics

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Lösningsförslag till exempeltenta 2

Generisk klass med typparameter Inre klass - ListIterator

Classes och Interfaces, Objects och References, Initialization

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Stackar, köer, iteratorer och paket

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Kopiering av objekt i Java

Tentamen. DD2385 Programutvecklingsteknik vt 2011 Tisdagen den 24 maj 2011 kl Hjälpmedel: penna, suddgummi, linjal

Länkade strukturer, parametriserade typer och undantag

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad mjukvaruutveckling. 15 högskolepoäng. TentamensKod: Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Föreläsning 13 Innehåll

Lösningar till tentamen i EDAF25

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Föreläsning 2 Datastrukturer (DAT037)

Mer OOP. Variation i typ. Medlen repetition. Generiska klasser. Gränssnitt - Interface. Mer om klasser Några exempel UML

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen. DD2385 Programutvecklingsteknik vt Tisdag 7 juni 2016 kl

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

Tentamen ID1004 Objektorienterad programmering December 15, 2012

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd

Konstruktion av klasser med klasser

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Föreläsning 12. Länkade listor

Tentamen i Objektorienterad modellering och diskreta strukturer

Undantag, Sammanfattning och Tentamensinfo. Objekt-orienterad programmering och design Alex Gerdes, 2016

Design Patterns Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Föreläsning 3. Stack

Transkript:

Design Patterns En kort introduktion

Vad är ett designmönster? Ett designmönster är en (namngiven) lösning på ett i en viss omgivning ofta återkommande problem. I mjukvaru-världen: En uppsättning klasser med givna relationer och operationer som löser ett återkommande problem. 2016-10-12 Anders Lindström, KTH STH 2

Först: Önskvärt i OO kod Klasser ska ha hög kohesion - en och endast en roll Låg koppling mellan moduler/klasser beroendet mellan klasser ska vara minimalt, en ändring i en klass ska ha så liten påverkan som möjligt på omgivande klasser Programmera mot gränssnitt, inte mot implementationer 2016-10-12 Anders Lindström, KTH STH 3

Inledande exempel: Ett enda objekt, Objekträknare, dålig lösning tillgängligt överallt public class QueueTicketDispenser { private static int objectcount = 0; private int nr; public QueueTicketDispenser() throws Exception { if(objectcount > 0) throw new Exception(); nr = 1; objectcount++; public int getnextnumber() { return nr++; 2016-10-12 Anders Lindström, KTH STH 4

Ett enda objekt, tillgängligt överallt Problem med lösningen (objekträknare)? Om vi försöker skapa fler objekt upptäcks detta först vid exekvering (Exception, run-time) Skulle referensen försvinna kan vi inte återskapa objektet, eller inte längre komma åt det objekt som finns 2016-10-12 Anders Lindström, KTH STH 5

Ett enda objekt, tillgängligt överallt static data, bättre? public class QueueTicketDispenser { private static int nr = 1; public static int getnextnumber() { return nr++; 2016-10-12 Anders Lindström, KTH STH 6

Ett enda objekt, tillgängligt överallt Problem med lösningen (static data)? static datat initieras vid programstart, oavsett om det behövs eller ej Ej riktigt objekt, d.v.s. ej tillgång till mekanismer för objekt 2016-10-12 Anders Lindström, KTH STH 7

Ett enda objekt, tillgängligt överallt Bästa lösningen (?) public class QueueTicketDispenser { private int nr; private static QueueTicketDispenser theobject; public static QueueTicketDispenser getinstance() { if(theobject == null) theobject = new QueueTicketDispenser(); return theobject; private QueueTicketDispenser() { nr = 1; public int getnextnumber() { return nr++; 2016-10-12 Anders Lindström, KTH STH 8

Ett enda objekt, tillgängligt överallt - Singleton Designmönstret Singleton Endast ett objekt Objektet skapas först när det behövs Lösningen ej trådsäker Hackerns favoritmönster. Risk för sjukdomen Singeltonit. 2016-10-12 Anders Lindström, KTH STH 9

Typer av designmönster Enligt Gang of Four : Skapelsemönster Strukturmönster Beteendemönster 2016-10-12 Anders Lindström, KTH STH 10

Iterator Att löpa igenom objekten i en behållare på ett av behållaren oberoende sätt (?) List list = new ArrayList() / newlinkedlist(); Iterator it = list.iterator(); while(it.hasnext()) { Object o = it.next(); ; Javas for each -loop är syntaktiskt socker för iterator-loop: for(object o: list) { 2016-10-12 Anders Lindström, KTH STH 11

Iterator internt Inkapslat i iteratorn: - i fallet lista med intern array index för aktuellt element samt referens till listan - i fallet länkad lista en referens till aktuellt element som succesivt flyttas fram null it.current 2016-10-12 Anders Lindström, KTH STH 12

Iterator 2016-10-12 Anders Lindström, KTH STH 13

Composite: Att hantera hierarkier Ett filsystem består av noder som kan vara av typen fil eller directory. Ett directory kan innehålla noder. 2016-10-12 Anders Lindström, KTH STH 14

Composite, lösning class Directory extends Node { private ArrayList<Node> thenodes;. Ska metoderna addnode, removenode, getchildren finnas redan i basklasen Node? 2016-10-12 Anders Lindström, KTH STH 15

Composite, generell lösning Använd Composite när du vill representera objekt och hierarkier av objekt samt använda operationer för både enskilda objekt och hierarkier på samma sätt 2016-10-12 Anders Lindström, KTH STH 16

Proxy: Ställföreträdare Vi vill inte initiera en kostsam resurs förrän den verkligen behövs, lazy proxy. 2016-10-12 Anders Lindström, KTH STH 17

Proxy: Ställföreträdare public interface Image { public abstract String getfilename(); public abstract void draw(graphics g); public class ImageFile implements Image { private String file; public ImageFile(String file) { // Open and load the image... public String getfilename() { return file; public void draw(graphics g) { // Draw the image... 2016-10-12 Anders Lindström, KTH STH 18

Proxy: Ställföreträdare public class ImageProxy implements Image { private String file; private ImageFile realimage; public ImageProxy(String file) { this.file = file; realimage = null; public void draw(graphics g) { if(realimage == null) realimage = new ImageFile(file); realimage.draw(g); public String getfilename() { return file; 2016-10-12 Anders Lindström, KTH STH 19

Proxy: Ställföreträdare Ibland vill/kan man inte anropa ett objekt direkt utan måste gå via en ställföreträdare, proxy Objektet finns på en annan dator Objektet är resurskrävande Åtkomstskydd behövs Smarta referenser 2016-10-12 Anders Lindström, KTH STH 20

Template method Implementera de kodstycken i en metod som inte varierar i superklassen (som separata, privata eller final, metoder) Omdefiniera de kodstycken i en metod som varierar i subklasserna (via separata metoder) 2016-10-12 Anders Lindström, KTH STH 21

Template method public class Shape{ public final void paint( ) { setcolors(); setstroke(); drawshape( ); writetoimagebuffer(); En metod deklarerad final kan inte omdefinieras i subklasser private void setcolors() { //... private void setstroke() { //... private void writetoimagebuffer() { //... protected void drawshape( ) { // draw, using g. Override in subklasses. Denna metod ska omdefinieras i subklasser - kan ev. deklareras abstract 2016-10-12 Anders Lindström, KTH STH 22

Strategy: Att kapsla in beteende Syfte: Att kapsla in beteende att användas som strategi/delmoment i andra algoritmer strategier kan bytas ut dynamiskt Ersätter villkorade specialfall void context(strategy strategy) { ; strategy.algorithm(); ; ----- context(new ConcreteStrategyA()); ; 2016-10-12 Anders Lindström, KTH STH 23

Strategy: Att kapsla in beteende Vi önskar använda en och samma sorteringsalgoritm, men göra kriterierna vi använder, för att jämföra objekten, utbytbara. Ett interface vars skilda implementationer definierar olika sätt att jämföra: public interface Comparator<T> { public abstract int compare(t obj1,t obj2); 2016-10-12 Anders Lindström, KTH STH 24

Strategy: Att kapsla in beteende Sorteringsalgoritm: public static <T> void sort ( ArrayList<T> list, Comparator<T> c) { for( ) { for( ) { if(c.compare(list.get(i),list.get(j)) < 0) { // Swap 2016-10-12 Anders Lindström, KTH STH 25

Strategy: Att kapsla in beteende Ex på Comparator public class LastNameComparator implements Comparator<Person> { public int compare(person p1, Person p2) { return p1.getlastname().compareto( p2.getlastname()); 2016-10-12 Anders Lindström, KTH STH 26

Model-View-Controller Applikationer med användargränssnitt Separerar roller - modellen: de data applikationen ska representera och logiken kring detta - vyn: presentationen av data - controllern: hanterar input från användaren, initierar uppdateringart av modellen och vyn Uppfyller - Hög kohesion - Låg koppling - Möjligt att byta ut vyn, alternativt ha flera vyer till samma modell 2016-10-12 Anders Lindström, KTH STH 27

Model-View-Controller 2016-10-12 Anders Lindström, KTH STH 28

Façade Definiera ett förenklat gränssnitt mot ett komplicerat system 2016-10-12 Anders Lindström, KTH STH 29

Observer-Subject: Enkelrikta beroende När ett objekt (subject) uppdaterats behöver objekt (observers) veta detta Model-View: Vyerna (observers) behöver veta när modellen (subject) uppdaterats 2016-10-12 Anders Lindström, KTH STH 30

Observer-Subject: Enkelrikta beroende Vi önskar enkelriktade beroenden: 2016-10-12 Anders Lindström, KTH STH 31

Observer-Subject: Enkelrikta beroende Metoder som modifierar dokumentet ska anropa notifyobservers() 2016-10-12 Anders Lindström, KTH STH 32

Observer-Subject: Enkelrikta beroende 2016-10-12 Anders Lindström, KTH STH 33

Anti-mönster Call-super ett super-sub förhållande som kräver att en omdefinierad metod, m, anropar super.m Rectangle-Square-problem arv som inte följer Liskovs substitutionsprincip God object (inte good object) ett objekt som har för många roller (> 1) Sequential coupling en klass som kräver att deras metoder anropas i en viss ordning Singletonitis YAFL, Yet Another F* Layer onödiga lager eller indirekta anrop. Orsakas av överanvändning av designmönster 2016-10-12 Anders Lindström, KTH STH 34

Arv vs. Komposition Arv en linje är en form (relation mellan klasser) Subklassen har (viss) insyn i/beroende av superklassens implementation kan göra subklassen känslig för förändringar i superklassen - undvik att ärva från klasser som inte säkert är färdigutvecklade - undvik att ärva klasser från andra paket, API Komposition en bil består av en motor (relation mellan objekt) Komposition är en strängare form av aggregat, de aggregerade objekten är privata och deras livslängd bestäms av aggregatets livslängd. 2016-10-12 Anders Lindström, KTH STH 35

Arv vs. Komposition Exempel: Skapa en kö-klass med hjälp av java.util.linkedlist Kontrakt: - Element läggs till i slutet av kön (enqueue) - Element tas bort från början av kön (dequeue) - size, isempty En kö är en specialisering av en lista? eller En kö består av en lista? 2016-10-12 Anders Lindström, KTH STH 36

Arv vs. Komposition Via arv: class Queue<T> extends LinkedList<T> { public void enqueue(t element) { this.addlast(element); public T dequeue() { return this.removefirst(); Varför är arv en mindre god idé i detta fall? Svar: Sub-klassen ärver metoder som bryter kontraktet! 2016-10-12 Anders Lindström, KTH STH 37

Arv vs. Komposition Via komposition: class Queue<T> { private LinkedList<T> list = new LinkedList<T>(); public void enqueue(t element) { list.addlast(element); public T dequeue() { return list.removefirst(); public int size() { return list.size(); public boolean isempty() { return list.isempty(); 2016-10-12 Anders Lindström, KTH STH 38

Arv vs. komposition Vilken av implementationerna uppfyller kontraktet för kö-klassen - Arv => hela gränssnittet ärvs. Önskvärt? - Arv ger möjlighet till polymorfism - Egenskaper från flera olika typer ej möjligt om vi inte har multipelt arv (men möjligt vid komposition) - Ändringar i superklassens implementation kan påverka subklasser direkt Tumregel: Föredra komposition före arv i situationer där båda verkar tänkbara 2016-10-12 Anders Lindström, KTH STH 39

Generella designprinciper Bilting: Designa med ändringar i åtanke Klasser/paket bör uppfylla: Hög kohesion (sammanhållning) Låg koppling Återanvändning möjlig 2016-10-12 Anders Lindström, KTH STH 40

Läsa mer http://sourcemaking.com/design_patterns Designmönster för programmerare Ulf Bilting Studentlitteratur Design Patterns: Elements of Reusable Object- Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (Gang of Four) Addison-Wesley 2016-10-12 Anders Lindström, KTH STH 41