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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

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

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

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

Designmönster/Design patterns

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

DAT043 - Föreläsning 7

" «Observable» DataGenerator" betyder att klassen DataGenerator ärver från den abstrakta klassen Observable.

Laboration 2: Designmönster

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

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

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

Laboration 2: Designmönster

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

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

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

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

Föreläsning 8. Designmönster

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

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

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

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

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

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

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

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

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

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

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

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

Föreläsning 15: Repetition DVGA02

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

Lösningar till tentamen i EDAF25

Lösningar till tentamen i EDAF25

tentaplugg.nu av studenter för studenter

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

LULEÅ TEKNISKA UNIVERSITET

Om fem stycken :GameObject ligger i vägen för b:bullet så kommer alltid loopen köras fem gånger. Välj ett alternativ

OOP Objekt-orienterad programmering

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

Objektorienterad Programmering (TDDC77)

Instuderingsuppgifter läsvecka 2

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

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

Abstrakta Klasser 2. Kodning är bara en liten del i programvaruutvecklingen 6% 1% 6% Abstrakta Klasser - deklaration. Programutveckling sker i faser

Viktiga programmeringsbegrepp: Kontrakt

Tentamen NOA011 Systemarkitektprogrammet. 51 poäng

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Transkript:

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

Live code DIT952.polygon

AbstractPolygon <<abstract>> # getpointswithbase(abstractpolygon) : List<Point> # getpoints() : List<Point> IPolygon <<interface>> + getcenterpoint() : Point PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon RotatedPolygon TranslatedPolygon ScaledPolygon BasePolygon - base : AbstractPolygon - radians : double + getcenterpoint() : Point - base : AbstractPolygon - xmove : int - ymove : int + getcenterpoint() : Point - base : AbstractPolygon - xfactor : double - yfactor : double + getcenterpoint() : Point - centerpoint : Point - points : List<Point> + getcenterpoint() : Point

Quiz: Vilket Design Pattern? Template Method Pattern AbstractPolygon <<abstract>> # getpointswithbase(abstractpolygon) : List<Point> public List<Point> getpointswithbase( ) { manipulatepoint( ); } protected abstract void manipulatepoint(); RotatedPolygon TranslatedPolygon ScaledPolygon BasePolygon

Template Method Pattern When a mostly generic algorithm has context-dependent behavior: Create an abstract superclass that implements the algorithm; Include an abstract method representing 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. Syftet är att åstadkomma återanvändning av kod, trots att denna kod till vissa delar skiljer sig åt mellan de olika sammanhang den används i.

Quiz: Vilket Design Pattern? Factory Method Pattern IPolygon <<interface>> + getcenterpoint() : Point PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon Hide concrete choice of data representation and constructors by creating concrete objects through static methods, whose return types specify an interface type.

Factory Method Pattern En Factory Method är en (oftast) statisk metod som abstraherar (döljer) beteendet hos en eller flera konkreta konstruktorer. Minskar beroendet på paket-interna konkreta representationer. 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. En Factory är, per analogi, en class vars gränssnitt består av Factory Methods. Obs: Abstract Factory Pattern är ett pattern som involverar användning av en väldigt specifik sorts Factory. De flesta Factories vi använder har inget med Abstract Factory Pattern att göra.

Abstract Factory Pattern Create an abstract type for a Factory that specifies one or more abstract Factory Methods. Create different concrete Factories as subtypes to the abstract Factory type, each of which can return a objects of different concrete types for each specified Factory Method. Poängen med Abstract Factory Pattern är att abstrahera över många olika Factories, där varje konkret Factory kan returnera olika konkreta representationer från sina Factory Methods. E.g. Vi skulle kunna ha två olika Factories för polygoner, med samma gränssnitt, där den ena returnerar stora polygoner och den andra returnerar små. DrawPolygons kan sen (låta användaren) välja av dessa den vill använda, utan att förändra resten av koden.

Facade Pattern Quiz: Vilket Design Pattern? IPolygon <<interface>> + getcenterpoint() : Point PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon Hide internal complexity by introducing an object that provides a simpler interface for clients to use.

Facade Pattern Syftet med Facade Pattern är att öka abstraktionen för en sub-komponent (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. Resten av sub-komponenten måste inte vara package private för att ett Facade object ska vara användbart. Vi kan ha det för att ge ett skyltfönster som tillhandahåller de vanligaste operationerna. Obs: En Facade måste inte vara en Factory, det råkar bara vara det i vårt exempel. En Facade till ett package som tillhandahåller en datarepresentation, innehåller dock ofta Factory Methods.

Module Pattern RotatedPolygon - base : AbstractPolygon - radians : double AbstractPolygon <<abstract>> # getpointswithbase(abstractpolygon) : List<Point> # getpoints() : List<Point> Quiz: Vilket Design Pattern? IPolygon <<interface>> + getcenterpoint() : Point Group several related elements, such as classes, singletons, methods, globally used, TranslatedPolygon into a single conceptual ScaledPolygonentity. - base : AbstractPolygon - xmove : int - ymove : int - base : AbstractPolygon - xfactor : double - yfactor : double PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon BasePolygon - centerpoint : Point - points : List<Point> + getcenterpoint() : Point + getcenterpoint() : Point + getcenterpoint() : Point + getcenterpoint() : Point

Module Pattern Module Pattern syftar till att skapa sammanhängande enheter på högre nivå än e.g. klasser. Finns olika tolkningar: en tolkning är att det inte är Module Pattern på riktigt om man inte har en klass som representerar modulen, dvs en klass som inrymmer hela beteendet. Anledningen är att det i språk som inte har språk-stöd för att skapa moduler (e.g. Javas packages) är så man skulle göra, och det är för dessa språk mönstret ursprungligen utvecklats.

Quiz: Vilket Design Pattern? Observer Pattern When an object needs to notify other objects of events, without directly depending on them: broadcast the events on an open channel, to which any interested object may register. DIT952.polygon PolygonViewer + actonupdate() : void AnimateListener <<interface>> + actonupdate() : void IPolygon <<interface>> + getcenterpoint() : Point PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon PolygonModel - polygons : List<IPolygon> - listeners : List<AnimateListener> + animate() : void + addpolygon(ipolygon) : void + addlistener(animatelistener) : void - notifylisteners() : void

Observer Pattern DIP: Definiera ett interface enligt vilket objektet kommer att broadcasta sina events, och låt vem som vill implementera detta interface och registrera sig för att lyssna. Den som lyssnar kallas observer; den som skickar events kallas observable. Hollywood Principle : Don t call us, we ll call you. Tell, don t ask

Quiz: Vilket Design Pattern? Model-View-Controller Pattern Ensure that the model does not depend on the user interface (views and controllers) DIT952.polygon IPolygon <<interface>> + getcenterpoint() : Point PolygonController - model : PolygonModel - view : PolygonViewer + mouseclicked(mouseevent) : void PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon PolygonViewer + actonupdate() : void AnimateListener <<interface>> + actonupdate() : void PolygonModel - polygons : List<IPolygon> - listeners : List<AnimateListener> + animate() : void + addpolygon(ipolygon) : void + addlistener(animatelistener) : void - notifylisteners() : void

Quiz: Vilket Design Pattern? Decorator Pattern AbstractPolygon <<abstract>> # getpointswithbase(abstractpolygon) : List<Point> # getpoints() : List<Point> Attach additional responsibilities to an object dynamically as separate adapter objects, keeping the same interface. RotatedPolygon TranslatedPolygon ScaledPolygon BasePolygon - base : AbstractPolygon - radians : double - base : AbstractPolygon - xmove : int - ymove : int - base : AbstractPolygon - xfactor : double - yfactor : double - centerpoint : Point - points : List<Point> + getcenterpoint() : Point + getcenterpoint() : Point + getcenterpoint() : Point + getcenterpoint() : Point

Decorator Pattern Genom att dela upp ett komplext objekt i flera beståndsdelar, som kan sättas ihop lager på lager med samma gränssnitt, så kan vi uppfylla Single Responsibility Prinicple. An object should have at most one reason to change Varje reason to change förändringsdimension och vilka tillstånd som kan antas inom en sådan, kan särskiljas från övriga. Detta minskar kognitiv komplexitet, och minskar risken för felaktig sammanblandning mellan dimensioner. Med Decorator Pattern representeras ett objekt i domänen vi modellerar av en sammansättning av objects. E.g. En polygon kan representeras av en sammansättning av en BasePolygon, en RotatedPolygon adapter och en TranslatedPolygon adapter.

Live code translate, scale, rotate

Quiz: Vilket Design Pattern? Chain of Responsibility Pattern Chain the receiving objects of a request, and pass the request along until a suitable handler is found. RotatedPolygon TranslatedPolygon ScaledPolygon BasePolygon - base : AbstractPolygon - radians : double - base : AbstractPolygon - xmove : int - ymove : int - base : AbstractPolygon - xfactor : double - yfactor : double - centerpoint : Point - points : List<Point>

Chain of Responsibility Pattern Syftet med Chain of Responsibility Pattern är att undvika beroenden, från det objekt som skickar metod-anropet, till alla de objekt som skulle kunna hantera anropet. Genom att skapa en enda entry point där metod-anropet görs (helst via ett interface), så ser det från anroparen ut som att den pratar med ett enda objekt, trots att anropet internt kan skickas mellan flera olika objekt innan det hanteras.

Method Chaining Method chaining är namnet på den språkfeature i Java (och andra språk) som låter oss sätta ihop flera metodanrop i en kedja, utan att introducera lokala variabler för mellan-stegen. E.g. mypoly.translate(10,10).rotate(math.pi).scale(2,2); istället för IPolygon p1 = mypoly.translate(10,10); Ipolygon p2 = p1.rotate(math.pi); p2.scale(2,2);

Method Cascading Method Cascading är en specifik användning av Method Chaining, där objektet självt returneras från varje anrop i kedjan. Smidig teknik: Låt alla mutators returnera this istället för att ha void som retur-typ. Detta möjliggör Method Cascading. E.g.: public IPolygon rotate(double radians){ this.radians += radians; return this; } istället för public void rotate(double radians){ this.radians += radians; }

Quiz Varför är ett anrop som följande dåligt: view.getframe().repaint(); medan följande är en bra teknik? mypoly.translate(10,10).rotate(math.pi).scale(2,2); Svar: Det första involverar olika typer, det senare bara en typ. Det första introducerar därför extra beroenden.

Law of Demeter Law of Demeter (LoD), eller Principle of Least Knowledge, säger att vi ska undvika att introducera beroenden genom att hålla oss till följande riktlinjer: En klass ska bara känna till sina närmaste vänner (dvs ofrånkomliga beroenden). En klass ska inte anropa metoder hos andra än sina vänner. Don t talk to strangers

Law of Demeter Vi uppfyller LoD genom att introducera metoder som agerar på interna objekt, istället för generiska getters: public class View { private JFrame frame; public JFrame getframe() { return frame; } } public class View { private JFrame frame; public void repaintframe() { frame.repaint(); } } view.getframe().repaint(); view.repaintframe(); Genom att inte exponera den interna användningen av JFrame, kan vi senare ändra valet utan att externa klienter påverkas.

ISP: Interface Segregation Principle No client should be forced to depend on methods it does not use. Om ett objekt A är stort, med mycket funktionalitet, och objekt B beror på en liten del av denna funktionalitet: Introducera en abstraktion vars gränssnitt är precis den del av A som B behöver bero på.

Live code IPolygon

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

Quiz: Vilket design pattern? When a mostly generic algorithm can be varied in the details: Create an interface with methods that represent the variability; Use these methods within the generic algorithm; Define different concrete behaviors as separate classes that implement the interface, and pass these to the generic algorithm as necessary. Svar: Strategy Pattern (se föreläsning 5-2b).

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

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 snarlik 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.

Bridge Pattern When an aspect of an object can vary independently of the object itself: Create an interface with methods that represent the aspect; Use these methods within the object; Define different concrete implementations of the aspect and use these with the object as necessary. När ett objekt är sammansatt av olika komponenter, och dessa komponenter kan tänkas variera oberoende av objektet självt, då bör vi representera dessa med ett separat (SRP) interface (DIP) och låta konkreta implementationer av komponenterna implementera detta.

Bridge Pattern IComponent <<interface>> + method( ) : ExternalClient - component : IComponent + usemethod() : public void usemethod(){ component.method( ); } ConcreteComponent1 ConcreteComponent2 ConcreteComponent3 + method( ) : + method ( ) : + method ( ) :

State vs Strategy vs Bridge Pattern Bridge Pattern är i princip samma sak ytterligare en gång, men fyller ett annat syfte. State och Strategy är båda behavioral patterns som säger hur vi bör tänka för att åstadkomma ett specifikt beteende. Bridge pattern är ett structural pattern som förklarar hur vi bör tänka för att åstadkomma mesta möjliga variabilitet och polymorfism för objekt bestående av olika komponenter.

Exempel: State vs Strategy vs Bridge Pattern En bil kan ha olika sorters motorer. Det finns olika sorters bilar. Vi kan sätta ihop en motor med en bil till en specifik kombination, men konkreta bilar och motorer kan variera oberoende av varandra. Bridge Pattern En amfibiebil kan växla mellan att köra på land eller köra på vatten. Den har samma uppsättning beteenden (e.g. köra, svänga, backa), men dessa implementeras olika för olika tillstånd (land/vatten). State Pattern En bil kan köra längs en sträcka på olika sätt t ex så fort som möjligt, eller så bränslesnålt som möjligt. Funktionaliteten köra kan, vid olika tillfällen, ta en sådan strategi som argument, och anpassa beteendet därefter. Strategy Pattern

Sammanfattning Principer Single Responsibility Principle Open-Closed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle Separation of Concern Law of Demeter High Cohesion, Low Coupling Command-Query Separation Composition over Inheritance Get-put Principle Patterns och Tekniker Template Method, Strategy, State Bridge, Decorator, Adapter Factory Method, Abstract Factory Singleton Chain of Responsibility Iterator, Composite Module, Facade MVC, Observer, Mediator Defensive Copying Method Cascading

What s next Block 7-2: Objects vs Datatypes Lambdas