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

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

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

Principer, Patterns och Tekniker. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Principer, Patterns och Tekniker. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Principer, Pa+erns och Tekniker. Objekt-orienterad programmering och design Alex Gerdes, 2018

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design Alex Gerdes, 2018

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

Sammanfattning och Tentamensinfo Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

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

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

Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

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

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

Modulär design Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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

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

Classes och Interfaces, Objects och References, Initialization

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

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

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

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

JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012

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

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

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

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Laboration 2: Designmönster

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Model View Controller. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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

Design Patterns. En kort introduktion

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

Designmönster/Design patterns

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

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Laboration 2: Designmönster

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Kursombud. Objektorienterad modellering och diskreta strukturer / design. Agile? Designprinciper EDAF10 EDA061. Lennart Andersson. Grupper för projekt

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

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

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

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

Objektorienterad Programkonstruktion

Imperativ programmering. Föreläsning 4

Observer Pattern och MVC. Objekt-orienterad programmering och design Alex Gerdes, 2016

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Tentamen Programmering fortsättningskurs DIT950

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

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

DAT043 - Föreläsning 7

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

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

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

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

Generisk klass med typparameter Inre klass - ListIterator

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Föreläsning 2 Datastrukturer (DAT037)

Lösningar till tentamen i EDAF25

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 4 Innehåll

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

LÖSNINGSFÖRSLAG

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

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

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

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

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

SOLID är en akronym för fem stycken designprinciper som används vid mjukvaruutveckling. SOLID står för:

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Sammansatta datatyper Generics: Parametrisk polymorfism

DAT043 - föreläsning 8

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

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Design. Vad lärde jag mig förra lekfonen? Hur bidrog jag Fll lärandet? Kravhantering sammanfa0ning 13/04/14

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Undantag, Sammanfa,ning och Tentamensinfo. Objektorienterad programmering och design Alex Gerdes, 2018

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

Information. Computer

OOP Objekt-orienterad programmering

Länkade strukturer. (del 2)

Föreläsning 10. ADT:er och datastrukturer

Transkript:

Design Patterns Objekt-orienterad programmering och design Alex Gerdes, 2018

Vad är ett design pattern? Ett design pattern (designmönster) är en (ofta namngiven) generell lösning av en vanligt återkommande situation inom (mjukvaru-)design. Termen och konceptet kommer ursprungligen ifrån arkitektur. Populariserades inom objekt-orientering med boken Design Patterns, ofta idag refererad till som Gang of Four (efter de fyra författarna). Vi pratar mest om design patterns inom objekt-orienterad design, men de existerar (mer eller mindre uttalade och erkända) inom alla paradigmer. Ett design pattern har ingen färdig kod de är abstrakta mallar för hur ett problem kan lösas. Formaliserade best-practices. I en given situation och kontext kan vi instansiera ett design pattern med specifika klasser, metoder, etc, och få en färdig lösning.

S.O.L.I.D. Inom objekt-orientering finns ett antal övergripande principer som vi arbetar efter, e.g.: Open-Closed Principle: A component should be open for extension but closed for modification De fem viktigaste ( the first five Robert C. Martin) har fått en minnesregel SOLID och man pratar ofta om SOLID objektorientering. Kan ni nämna fyra av de fem? Single Responsibility Principle, Open-Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Inversion Principle. (Vi har inte tagit upp Interface Segregation Principle ännu.)

Design patterns vs principer Vårt mål är a* följa principerna design pa*erns ger oss generella mönster för hur vi kan uppnå dem i specifika situa=oner. Ingen skarp gräns, snarare en glidande skala; från principer i den mest abstrakta änden, =ll färdig kod i den mest konkreta, med design pa*erns någonstans däremellan. Extensibility Reuseability Maintainability Abstrakt OCP DIP Design patterns Best practices Färdig kod Konkret

Quiz: Vilket design pa2ern? Provide a way to access the elements of an aggregate object sequencally without exposing its underlying representacon. Ge klienter tillgång till elementen i ett sammansatt objekt som en sekvens, utan att visa hur objektet internt är uppbyggt. Svar: Iterator Pattern

Iterator Pattern Syftet med Iterator Pattern är abstraktion att dölja intern representation från externa klienter. I Java finns interfacen Iterator<T> och Iterable<T>, som är de rekommenderade verktyget att använda när man applicerar Iterator Pattern i Java. Kärnan i detta pattern är dock den klass som implementerar Iterable<T> - det är den som verkligen använder Iterator Pattern, genom att dölja sin interna struktur.

Iterator Pattern Iterable<T> <<interface>> + iterator() : Iterator<T> AggregateObject - data : ArrayList<String> + iterator() : Iterator<String> Implementerar Iterator Pattern genom att inte utåt exponera intern struktur (i detta fall användandet av ArrayList) Iterator<T> <<interface>> + hasnext() : boolean + next() : T + remove() : void ExternalClient AggregateObject ao = for (String str : ao) { }

Quiz Varför implementerar ett aggregate objekt inte direkt Iterator interfacet men Iterable istället (som returnerar en Iterator)? Svar: e> objekt kan itereras flera gånger samadigt och man måste ha Allståndet (på vilken plats man är i samlingen) separat.

Live code Map

Composite Pattern Treat a group of objects uniformly as if they were a single instance of an object. Gör det möjligt att använda grupper av objekt på samma sätt som ett enskilt objekt av den typen. I övningen försöker vi halvvägs behandla en lista av polygoner på samma sätt som en ensam polygon, e.g. vi definierar paint (men inte updatecenter än) för en hel lista.

Composite Pattern Component <<abstract>> + operation( ) : Concrete + operation( ) : Composite + operation( ) : + add(component) : void + remove() : void getchild( ) : Component

Template Method Pattern When a mostly generic algorithm has context-dependent behavior: Create an abstract superclass that implements the algorithm; Include an abstract method represen<ng the context-dependent behavior, and call this method from the algorithm; Implement the context-dependent behavior in different sub-classes. När kod som är till stora delar gemensam, men beror på en liten del som inte är gemensam: bryt ut det som är gemensamt i en abstrakt klass, och låt det som inte är gemensamt representeras av en abstrakt metod som kan implementeras olika i olika sub-klasser.

Live code tda551.shapes.polygon

Template Method Pattern Syftet med Template Method Pattern är att åstadkomma återanvändning av kod, trots att denna kod till vissa delar skiljer sig åt mellan de olika kontexten där den används. I grundutförandet pratas om abstract superclass och kontext som subclasses (som i exemplet) men det går lika bra att använda Template Method Pattern med delegering och interfaces också.

Template Method Pattern Template <<abstract>> # contextdependent( ) : + templatemethod( ) : public void templatemethod( ) { contextdependent( ); } protected abstract void contextdependent(); Context1 # contextdependent( ) : Context2 # contextdependent( ) : Context3 # contextdependent( ) :

Template Method Pattern i tda551.shapes.polygon Polygon <<abstract>> # getoffsets() : int[][] + getcorners() : List<Point> public List<Point> getcorners() { int[][] offsets = getoffsets(); } protected abstract int[][] getoffsets(); Rectangle # getoffsets() : int[][] Triangle # getoffsets() : int[][]

Template Method Pattern (delegering) IContext <<interface>> ~ contextdependent( ) : Template + templatemethod(icontext ctxt, ) : public void templatemethod(icontext ctxt){ ctxt.contextdependent( ); } public void templatemethod(){ template.templatemethod(this); } Context1 Context2 Context3 - template : Template ~ contextdependent( ) : + templatemethod( ) - template : Template ~ contextdependent( ) : + templatemethod( ) - template : Template ~ contextdependent( ) : + templatemethod( )

Viktigt om Template Method Pattern OBS: För a* det ska röra sig om Template Method Pa*ern måste vi ha både den abstrakta metoden som implementeras i subklasserna (e.g. getoffsets), och den konkreta templatemethod som anropar den abstrakta (e.g. getcorners). A* bara ha en abstrakt metod (e.g. paint i Shape) är inte en instans av Template Method Pa*ern det är helt vanlig användning av en abstrakt klass för polymorfism. Template <<abstract>> # contextdependent( ) : + templatemethod( ) : Context # contextdependent( ) :

Live code Plotter

Strategy Pattern Strategy Pattern går steget längre än Template Method Pattern. Vi knyter inte det som varierar till en specifik subclass (kontext), utan definierar ett fristående interface. Vi kan sen definiera helt olika beteenden som fristående klasser som implementerar detta interface. Konkret exempel i Java: Comparator<T> med metoden compare(t o1, T o2). Vi kan t ex implementera olika Comparator<String> med olika beteende ascending/descending order, case (in-)sensitive, längd, - för att jämföra strängar. I Collections finns metoden sort som utnyttjar detta: public static <T> void sort(list<t> list, Comparator<? super T> c) { }

Strategy Pattern IStrategy <<interface>> + strategy( ) : ExternalClient + usestrategy(istrategy ctxt, ) : public void usestrategy(istrategy strat){ strat.strategy( ); } ConcreteStrategy1 ConcreteStrategy2 ConcreteStrategy3 + strategy( ) : + strategy( ) : + strategy( ) :

Live code Plotter

Strategy Pattern i Plotter Function <<interface>> + apply(double) : double Plotter + plotfunction(graphics g) : void public void plotfunction(graphics g){ fun.apply( ); } SinusFunction CosinusFunction TangesFunction + apply(double) : double + apply(double) : double + apply(double) : double

Local state Muterbara objekt har per defini2on olika (kanske oändligt många) 2llstånd (states) de kan anta. E= objekts interna 2llstånd kallar vi för local state. Med naiv local state kan vi råka i trubbel: Tillståndet (state) kan uppdateras oväntat. Dåligt designade objekt kan hamna i inkonsekventa (inconsistent) 2llstånd E.g. flera a=ribut där värdet på e= av dem ska kunna härledas ur de andra, men håller fel värde. bedisdown == true bedangle > 0

State Pattern When an object can vary between a finite number of different states: Create an interface with methods that represent the variability; Use these methods within the object; Define different concrete states as separate classes that implement the interface, and use these internally in the object as necessary. Definiera det som skiljer mellan olika states som objekt av olika klasser. Kombineras gärna med Singleton Pattern, då det bara bör finnas ett objekt som representerar varje specifikt tillstånd. Växla mellan tillstånd med hjälp av specifika metoder, antingen i huvud-objektet eller hos de olika state-objekten (e.g. finite state machine).

State Pattern IState <<interface>> + statemethod( ) : ExternalClient - state : IState + usemethod( ) : + setstate(istate state) : void public void usemethod(){ state.statemethod( ); } ConcreteState1 ConcreteState2 ConcreteState3 + statemethod( ) : + statemethod( ) : + statemethod( ) :

State vs Strategy Pattern State Pattern är implementationsmässigt detsamma som Strategy Pattern men sättet vi använder det på skiljer sig lite. I Strategy Pattern väljer vi en av många strategies, och kör sen vår algoritm med den. I State Pattern vill vi kunna byta mellan olika states över tid.

Olika sorters design pa0erns Begreppet Design Patterns spänner över en stor del av spektrat av lösningsmetoder, från väldigt konkret till hyfsat abstrakt. Extensibility Reuseability Maintainability Abstrakt OCP DIP Design patterns Best practices Färdig kod Vi kan skilja på olika sorters design patterns, baserat på vilken sorts problem de syftar till att lösa: Architectural, Structural, Behavioral, Creational, Konkret

Architectural design patterns Architectural patterns behandlar hur kod bör struktureras på en övergripande nivå, utan att gå in på specifika classes etc. Behandlas ibland separat från software design patterns de är ofta snarare system design patterns. Men gränsen är flytande. Exempel: Model-View-Controller; Module (i viss användning) Mer om MVC nästa föreläsningen.

Structural design patterns Structural patterns behandlar hur saker bör struktureras och hänga ihop på e.g. klass-nivå. För structural patterns ger vi typiskt ett UML-diagram med boxar med abstrakta namn, som vi ger konkreta namn när vi använder dem. Vi bryr oss om vilka classes och interfaces vi har, och vilka beroenden vi har mellan dem, men inte alltid vilka metoder de har. Exempel: Composite Specificerar ett specifikt sätt att ordna klasser inbördes för att åstadkomma en effekt i den här fallet att kunna använda grupper av objekt på samma sätt som enskilda objekt.

Behavioral design patterns Behavioral pattern behandlar hur vi bör tänka kring hur klasser och objekt kommunicerar med varandra. E.g. vilka argument- och retur-typer bör vi ge metoder. Ges ofta med mer detaljerade UML-diagram, där vi även bryr oss om vilka metoder vi har, och hur de interagerar. Exempel: Iterator Pattern, Template Method, Strategy Iterator Pattern säger att om externa klienter ska ges tillgång till intern aggregerad data (e.g. en intern lista), ge dem en abstrakt representation (en Iterator) och inte den konkreta listan (e.g. ArrayList).

Creational design patterns Crea%onal pa+erns behandlar hur vi bör tänka när vi skapar nya objekt. Kan ha många olika sy;en, all=från hur vi kan göra skapande av många objekt så effek=vt som möjligt, =ll hur vi kan dölja intern representa=on så mycket som möjligt. Exempel: Factory Method PaGern Factory Method PaGern säger ag vi kan introducera metoder som skapar objekten internt och sen returnerar dem.

Oviktig uppdelning Vilka patterns som tillhör vilken kategori är tämligen oviktigt, och inte alltid självklart. Det viktiga är insikten att design patterns dvs mallar och best practices kan finnas och vara användbart på många olika nivåer. Att förstå på vilken nivå ett design pattern agerar kan vara en hjälp att förstå det.

Quiz: Design pattern? Define an interface for creating an object, but let subclasses decide which concrete class to instantiate. Let a class defer instantiation it uses to subclasses. Definiera en metod som säger sig skapa objekt av en abstrakt typ (abstract class, interface). Låt subtyper avgöra vilken faktisk konkret typ som instansieras, genom overriding/implementering av metoden. Svar: Factory Method Pattern (ursprunglig formulering)

Factory Method Pattern Syftet med Factory Method Pattern är att dölja intern implementation: Vilka konkreta konstruktorer som används. Vilka specifika klasser som används undviker beroende på konkreta implementationer (följer DIP). En Factory Method kan ha ett mer sofistikerat beteende än en konstruktor, t ex genom att välja mellan flera tillgängliga konstruktorer, ev från olika konkreta classes. Alternativt namn: Smart Constructor (används oftare för funktionella språk). Kan vara så enkel som att bara delegera till en specifik explicit konstruktor. Framtidssäkring : Om vi i framtiden behöver mer eller ändrad funktionalitet kan vi ändra i vår Factory Method, istället för att behöva ändra alla anrop till konstruktorn.

Live code PolygonFactory

Point + paint(graphics) : void JComponent + paint(graphics) : void JFrame + paint(graphics) : void ArrayList + paint(graphics) : void Polygon <<abstract>> DrawPolygons Rectangle + drawer : DrawPolygons + centerpoint : Point + paint(graphics) : void + updatecenter(int,int) : void Triangle Square + polygons : ArrayList<Polygon> + frame : JFrame + ticker : int + direction : boolean + paint(graphics) : void + update() : void + main(string[]) : void + paint(graphics) : void + paint(graphics) : void + paint(graphics) : void

Point + paint(graphics) : void JComponent + paint(graphics) : void JFrame + paint(graphics) : void ArrayList + paint(graphics) : void Rectangle Polygon <<abstract>> - centerpoint : Point + paint(graphics) : void + updatecenter(int,int) : void Triangle PolygonFactory + createrectangle(int,int) : Polygon + createsquare(int,int) : Polygon + createtriangle(int,int) : Polygon Square DrawPolygons + polygons : ArrayList<Polygon> + frame : JFrame + ticker : int + direction : boolean + paint(graphics) : void + update() : void + main(string[]) : void + paint(graphics) : void + paint(graphics) : void + paint(graphics) : void

Quiz: Vilket design pattern? Hide internal complexity by introducing an object that provides a simpler interface for clients to use. Dölj intern komplexitet och representation genom ett väldefinierat gränssnitt. Detta gränssnitt tillhandahålls av ett objekt, och ibland även ett antal associerade interfaces. Svar: Facade Pattern

Facade Pattern Syftet med Facade Pattern är att öka abstraktionen för en subkomponent (e.g. package), genom att gömma intern komplexitet bakom en fasad, som ger ett förenklat (och abstrakt) gränssnitt. Gör en komponent bibliotek lättare att förstå och använda. Reducera beroenden från extern kod på interna detaljer. Ibland: dölj ett dåligt designat gränssnitt bakom ett bättre.

Live code PolygonFactory + IPolygon

Quiz: Vilket design pattern? Allow otherwise incompatible classes to work together by converting the interface of one class into an interface expected by the clients. Få inkompatibla komponenter att fungera ihop genom att konvertera gränssnittet hos den ena till det som den andra (klienten) förväntar sig. Hint: Hur kan du stoppa in e.g. en USB-kontakt i ett strömuttag? Svar: Adapter Pattern

Adapter Pattern Syftet med Adapter Pattern är att göra annars inkompatibla komponenter kompatibla med varandra. Kallas ibland slarvigt för Wrapper men den termen är tvetydig och kan syfta på många olika design patterns. Används typiskt när kod tidigare fungerat med komponent X, och nu (också) behöver fungera med komponent Y som har ett annat gränssnitt. I tda551.polygons vill vi byta ut subkomponenten polygons mot det nya tda551.shapes.

Live code Plugging in tda551.shapes into tda551.polygons

Summering Design patterns låter oss återanvända struktur och metodik som andra smarta designers redan kommit på, och som använts och prövats under lång tid. Ofta är design patterns konkret formulerade tekniker för att följa våra SOLID-principer i specifika fall. Principerna är de mål vi vill uppnå, design patterns är verktyg. E.g. Iterator Pattern gör att vi följer Dependency Inversion Principle. Det är viktigt att förstå vad det är ett design pattern vill åstadkomma, för att veta hur och när det bör appliceras.

What s next Block 5-2: Model View Controller