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

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

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

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

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

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

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

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

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

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 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

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

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

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

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

Designmönster/Design patterns

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Laboration 2: Designmönster

DAT043 - Föreläsning 7

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

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

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

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

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

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

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

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

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

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

Laboration 2: Designmönster

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

Föreläsning 8. Designmönster

Observer Pa*ern och MVC. Objekt-orienterad programmering och design Alex Gerdes, 2018

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

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

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

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

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

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

Lösningar till tentamen i EDAF25

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

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

Lösningar till tentamen i EDAF25

LULEÅ TEKNISKA UNIVERSITET

Instuderingsuppgifter läsvecka 2

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

tentaplugg.nu av studenter för studenter

Viktiga programmeringsbegrepp: Kontrakt

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

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

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

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

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

Computer projekttid. Objektorienterad modellering och diskreta strukturer / design. Rapporter från verkligheten. EDAF10 i HT2

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad Programmering (TDDC77)

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

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

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

Tentamen NOA011 Systemarkitektprogrammet. 51 poäng

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

Föreläsning 15: Repetition DVGA02

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

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

Transkript:

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

Live code tda551.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 - 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

Template Method Quiz: Vilket Pattern Design 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 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 *ll 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. Sy?et är a@ åstadkomma återanvändning av kod, trots a@ denna kod *ll vissa delar skiljer sig åt mellan de olika kontexten där den används.

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 Pa3ern är a3 abstrahera över många olika Factories, där varje konkret Factory kan returnera olika konkreta representa?oner från sina Factory Methods. E.g. Vi skulle kunna ha två olika Factories för polygoner, med samma gränssni3, 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 a3 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 Quiz: Vilket Design PaTern? RotatedPolygon - base : AbstractPolygon - radians : double AbstractPolygon <<abstract>> # getpointswithbase(abstractpolygon) : List<Point> # getpoints() : List<Point> + getcenterpoint() : Point TranslatedPolygon - base : AbstractPolygon - xmove : int - ymove : int + getcenterpoint() : Point IPolygon <<interface>> + getcenterpoint() : Point Group several related elements, such as classes, singletons, methods, globally used, into a single conceptual enmty. ScaledPolygon - base : AbstractPolygon - xfactor : double - yfactor : double + getcenterpoint() : Point PolygonFactory + createrectangle(int,int) : IPolygon + createsquare(int,int) : IPolygon + createtriangle(int,int) : IPolygon BasePolygon - centerpoint : Point - points : List<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.

Observer Pattern Quiz: Vilket Design 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. tda551.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 e, interface enligt vilket objektet kommer a, broadcasta sina events, och låt vem som vill implementera de,a interface och registrera sig för a, 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

Model-View-Controller Quiz: Vilket Design Pattern Pattern? Ensure that the model does not depend on the user interface (views and controllers) DIT952.polygon PolygonController - model : PolygonModel - view : PolygonViewer + mouseclicked(mouseevent) : void 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

Decorator Quiz: Pattern Vilket Design 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.

Chain of Responsibility Quiz: Vilket Design Pattern 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.

Live code translate, scale, rotate

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; } } view.getframe().repaint(); public class View { private JFrame frame; public void repaintview() { frame.repaint(); } } view.repaintview(); 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å.

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-1).

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

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 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-1: Trådar (lite lambdas)