Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

 Jens Bennedsen 2002Objektorienteret systemudvikling Gode designløsninger GOF designmønstre.

Lignende præsentationer


Præsentationer af emnet: " Jens Bennedsen 2002Objektorienteret systemudvikling Gode designløsninger GOF designmønstre."— Præsentationens transcript:

1  Jens Bennedsen 2002Objektorienteret systemudvikling Gode designløsninger GOF designmønstre

2  Jens Bennedsen 2002Objektorienteret systemudvikling Abstraktioner og sprogmekanismer Arkitektoniske abstraktioner Sprogmekanismer Tid...

3  Jens Bennedsen 2002Objektorienteret systemudvikling Eksempler call return Tid record array class object goto goto sr a:... s:... goto a Simulering af abstrakte datatyper (ADT) Kræver stor disciplin og systematik af udvikleren. Ingen sprog- understøttelse. Manuel allokering og administration af lagerblokke; manuel adresse- beregning ved indeksering,... ?

4  Jens Bennedsen 2002Objektorienteret systemudvikling Eksempler call return Tid record array class object goto goto sr a:... s:... goto a Simulering af abstrakte datatyper (ADT) Manuel allokering og administration af lagerblokke; manuel adresse- beregning ved indeksering,... Mønstre...

5  Jens Bennedsen 2002Objektorienteret systemudvikling Gang of Four (GoF) Erich Gamma, Richard Helm Ralph Johnson & John Vlissides Design Patterns – Elements of Reusable Object-Oriented Software Addison-Wesley, 1995. (Også udgivet som CD, 1998) Første systematiske fremstilling af designmønstre.

6  Jens Bennedsen 2002Objektorienteret systemudvikling Designmønstre The Pattern Community: Aggresive disregard of originality Et designmønster - navngiver, - abstraherer og - identificerer de centrale aspekter ved en gængs designstruktur. Et designmønster identificerer deltagende klasser (og instanser) deres rolle og samarbejde samt ansvarsfordelingen mellem dem.

7  Jens Bennedsen 2002Objektorienteret systemudvikling Designmønstre i GoF (23) Creational (5)Structural (7)Behavioral (11) Abstract Factory Adapter Chain of Responsibility BuilderBridgeCommand Factory Method Composite Interpreter PrototypeDecoratorIterator Singleton FacadeMediator FlyweightMemento ProxyObserver State Strategy Template Method Visitor

8  Jens Bennedsen 2002Objektorienteret systemudvikling Observer Intent Definerer en en-til-mange sammenhæng mellem objekter så ændringer af tilstanden i et objekt automatisk reflekteres i alle de andre objekter (Publish-Subscribe). Motivation

9  Jens Bennedsen 2002Objektorienteret systemudvikling Observer (2) Structure

10  Jens Bennedsen 2002Objektorienteret systemudvikling Observer (3) Participants Subject, kender sine (abstrakte) observere; et vilkårligt antal observere kan knyttes til et subject; giver gennem sit interface mulighed for at tilknytte og fjerne observere Observer, definerer et interface til at opdatere objekter der skal bekendtgøres om ændringer i et subject ConcreteSubject, indkapsler tilstand for konkrete subjects; bekendtgør tilstandsændringer til observere ConcreteObserver, vedligeholder en reference til et ConcreteSubject objekt; indkapsler tilstand der skal være konsistent med subject

11  Jens Bennedsen 2002Objektorienteret systemudvikling Observer (4) Collaboration

12  Jens Bennedsen 2002Objektorienteret systemudvikling Observer, Sample Code (1) interface Observer { public abstract void update(Subject theChangedSubject); }; abstract class Subject { public void attach(Observer o) {observers.add(o);} public void Detach(Observer o) {observers.remove(o);} public void notify() {…}; protected Subject(); private List observers; };

13  Jens Bennedsen 2002Objektorienteret systemudvikling Observer, Sample Code (2) public void notify() { iterator i = observers.iterator(); while (i.hasNext()) (Observer)(i.next()).update(this); }

14  Jens Bennedsen 2002Objektorienteret systemudvikling Observer, Sample Code (3) class ClockTimer extends Subject { public ClockTimer(); public int getHour(); public int getMinute(); public int getSecond(); void tick(); // Tick kaldes jævnligt af en intern timer }; void ClockTimer::tick() { // opdatér intern repræsentation //... notify(); }

15  Jens Bennedsen 2002Objektorienteret systemudvikling Observer, Sample Code (4) class DigitalClock implements Widget extends Observer { public DigitalClock(ClockTimer); public void update(Subject) // (re-)definerer Observer::update public void draw(); // (re-)definerer Widget::draw private ClockTimer _subject; };

16  Jens Bennedsen 2002Objektorienteret systemudvikling Observer, Sample Code (5) DigitalClock::DigitalClock(ClockTimer s) { _subject = s; _subject.attach(this); } DigitalClock::finalize() { _subject.detach(this); } void DigitalClock::Update(Subject ChangedSubject) { if (ChangedSubject == _subject) draw(); } void DigitalClock::Draw() { // skaf de nye værdier fra _subject int hour = _subject.getHour(); int minute = _subject.getMinute(); // etc. // tegn det digitale ur }

17  Jens Bennedsen 2002Objektorienteret systemudvikling Iterator Intent Giver sekventiel tilgang til elementerne i en container (et aggregat) uden at afsløre containerens underliggende repræsentation. Motivation Problemstillingen og et bud på en løsning er velkendt:

18  Jens Bennedsen 2002Objektorienteret systemudvikling Iterator (2) Motivation, fortsat Imidlertid er det ufleksibelt at en klient skal vide at det er en liste der itereres på, men det kan undgås:

19  Jens Bennedsen 2002Objektorienteret systemudvikling Iterator (3) Structure CreateIterator er et eksempel på en Factory Method (GoF, pp. 107- 116).

20  Jens Bennedsen 2002Objektorienteret systemudvikling Composite Intent Sammensæt objekter i en rekursiv træstruktur der repræsenterer et part-whole hierarki. Mønsteret muliggør at enkelte og sammensatte elementer kan behandles uniformt. Motivation

21  Jens Bennedsen 2002Objektorienteret systemudvikling Composite (2) Structure

22  Jens Bennedsen 2002Objektorienteret systemudvikling Composite (3) Participants Component (Graphic) - erklærer et interface for objekter i strukturen - implementerer standardopførsel for alle objekter - erklærer et interface til “child“-komponenter (evt.) - erklærer et interface til “parent”-komponenter. Leaf (Rectangle, Line, Text, etc.) - repræsenterer primitive objekter (blade) - (re-)definerer opførsel for primitive objekter....

23  Jens Bennedsen 2002Objektorienteret systemudvikling Composite (4) Participants, fortsat Composite (Picture) - (re-)definerer opførsel for sammensatte objekter - gemmer referencer til efterfølgerobjekter - implementerer efterfølger-relaterede operationer fra interfacet. Client - manipulerer Component-objekter gennem Component- interfacet.

24  Jens Bennedsen 2002Objektorienteret systemudvikling Composite (5) Implementation... Skal operationer til håndtering af sammensatte objekter erklæres i Component eller i Composite? Svaret forudsætter en afvejning mellem sikkerhed og transparens; i dette designmønster er transparens fundet vigtigere end sikkerhed, men bemærk at det er i konflikt med substitutionsprincippet. Hvis operationerne flyttes ned i Composite, opstår der i Client behov for på runtime at kunne spørge på typen af et Component- objekt. I C++ kan man bruge dynamic_cast eller tilføje en operation getComposite i Component-interfacet:

25  Jens Bennedsen 2002Objektorienteret systemudvikling Composite, sikkerhed over transparens class Component { public: //... Composite getComposite() { return null; } }; class Composite extends Component { public: add(Component); remove(Component); //... Composite getComposite() { return this; } }; class Leaf extends Component { //... }

26  Jens Bennedsen 2002Objektorienteret systemudvikling Template Method Intent At definere grundstrukturen i en algoritme, men udskyde den konkrete fastlæggelse af enkelte trin til subklasser. Subklasser kan redefinere elementer i en algoritme, men grundstrukturen ligger fast. Motivation

27  Jens Bennedsen 2002Objektorienteret systemudvikling Template Method (2) Class Application { public void OpenDocument(String name) { if ( !CanOpenDocument(name) ) { // cannot handle this document return; } Document doc = DoCreateDocument(); if ( doc ) { _docs.AddDocument(doc); AboutToOpenDocument(doc); doc.Open(); doc.DoRead(); } private Vector _docs; }

28  Jens Bennedsen 2002Objektorienteret systemudvikling Template Method (3) class Shape { public Shape(int x, int y) _x(x), _y(y) {} public void move(int dx, int dy) { hide(); _x+= dx; _y+= dy; show(); } public abstract void show(); public abstract void hide(); protected int _x; protected int _y; }; Operationen ’move’ i et figurhierarki er en Template Method:

29  Jens Bennedsen 2002Objektorienteret systemudvikling Template Method (4) Structure

30  Jens Bennedsen 2002Objektorienteret systemudvikling Adapter Intent Konverterer interfacet for en klasse til et som klinten forventer (wrapper, late abstraction). Motivation Det kan ske at en klasse er svær at genbruge fordi den har et “forkert” interface (eks.: Vector og List burde kunne behandles uniform, men har forskellige interfaces). Eller: Til et tegneprogram kan det være ligetil at implementere klasserne Shape, LineShape, PolygonShape, hvorimod TextShape er noget mere kompliceret; selv basal teksteditering involverer komplicerede skærm-opdateringer og buffer-håndtering.

31  Jens Bennedsen 2002Objektorienteret systemudvikling Adapter, Motivation fortsat Imidlertid findes der en ‘off-the-shelf’ klasse, TextView; problemet er blot at denne ikke er designet – og derfor ikke kan behandles – som en Shape. Hvis vi har kildeteksten til TextView kan vi ændre interfacet så det passer til Shape, men ofte har man ikke kildeteksten, og selv om man har, er det af hensyn til andre applikationer ikke ønskeligt at tilpasse interfacet. Men vi kan definere TextShape som en adapter der tilpasser TextViews interface til Shape-hierarkiet. Dette kan gøres på to måder: Class Adapter Object Adapter

32  Jens Bennedsen 2002Objektorienteret systemudvikling Adapter public class Shape { // BoundingBox-based public Shape(){…} public Box BoundingBox(); public Manipulator CreateManipulator(); }; class TextView { // OriginAndExtent-based public: TextView(); //returnerer centrum public point GetOrigin(Coord& x, Coord& y){…} //retrunerer bredde og højde public pair GetExtent(){…} public bool isEmpty(){…} };

33  Jens Bennedsen 2002Objektorienteret systemudvikling Class Adapter (C++ style) class TextShape : public Shape, private TextView { public: TextShape(); virtual void BoundingBox(Point& bottomLeft, Point& topRight); virtual bool isEmpty(); virtual Manipulator* CreateManipulator(); }; void TextShape::BoundingBox(Point& bottomLeft, Point& topRight) { Coord bottom, left, width, height; GetOrigin(bottom, left); GetExtent(width, height); bottomLeft = Point(bottom, left); topRight = Point(bottom + height, left + width); }

34  Jens Bennedsen 2002Objektorienteret systemudvikling Adapter for containerklasser template class Vector { public: explicit Vector(size_t n); T& operator[](size_t); }; template class List { public: class Link {... }; List(); void put(T*); T* get(); }; Hver klasse tilbyder ”de naturlige operationer” – de er små og kan inlines (effektivt) – og for hver klasse kan vi vælge en passende repræsentationsinvariant uden at tænke på de øvrige containere. Imidlertid kan forekomster af de to forskellige slags containerklassser ikke behandles uniformt (for eksem- pel med en iterator), og det er træls! Hvad gør vi?

35  Jens Bennedsen 2002Objektorienteret systemudvikling Wrap, wrap, and abstract wrap abstract Late Abstraction

36  Jens Bennedsen 2002Objektorienteret systemudvikling Koden... template class VectorItor : public Itor { public: VectorItor(Vector & vv) : v(vv), index(0) {} T* first() {... } T* next() {... } private: Vector & v; size_t index; }; template class ListItor : public Itor { public: ListItor(List & llst) : lst(llst),... {} T* first() {... } T* next() {... } private: List & lst; List ::Link p; }; template class Itor { public: virtual T* first()= 0; virtual T* next()= 0; };

37  Jens Bennedsen 2002Objektorienteret systemudvikling Anvendelser int count (Itor & i, int x) { int c = 0; for ( int* p=i.first(); p; p=i.next() ) if ( *p==x ) c++; return c; } Vector v; VectorItor vi(v); int periodCount = count(vi, 7); List l; ListItor li(v); int commaCount = count(li, 42); Operationerne first() og next() er simple, men de giver et overhead i form af et virtuelt funktionskald. Til et standardbibliotek er det ikke ideelt, men løsningen har dog været brugt i et utal af systemer, og i mange år var det faktisk Bjarne Stroustrups favoritløsning. Lige indtil Alexander Stepanov og Meng Lee fra HP kom med STL...

38  Jens Bennedsen 2002Objektorienteret systemudvikling Hvad vi lærte af “Late Abstraction” Bemærk: Et fælles interface som Itor kan laves længe efter at containerklasserne er designet og implementeret. Når vi designer og program-merer, udvikler vi typisk først noget meget konkret (for ek-sempel Vector og List ). Først senere erkender vi ab- straktioner der kan generali-sere de mere konkrete kom-ponenter (f. eks. Itor ). ”Late abstraction” kan vi benytte gentagne gange. ”Late abstraction” vha. abstrakte klasser tillader os at lave forskellige implementa-tioner af et begreb også når der ikke er en åbenlys lighed mellem implementationerne. Vector og List har oplagte fællestræk, men der er ikke noget i vejen for også at lave en Itor for eksempelvis en stream.

39  Jens Bennedsen 2002Objektorienteret systemudvikling Factory method Frameworks bruger abstrakte klasser til at definere og vedligeholde sammenhæng mellem objekter. Et framework har ofte ansvaret for at oprette disse objekter. Dette gælder for eksempel Collection frameworket i java

40  Jens Bennedsen 2002Objektorienteret systemudvikling Factory Method

41  Jens Bennedsen 2002Objektorienteret systemudvikling Struktur

42  Jens Bennedsen 2002Objektorienteret systemudvikling struktur Product (TIterator) defines the interface of objects the factory method creates. ConcreteProduct (TKundeIterator) implements the Product interface. Creator (TContainer) declares the factory method, which returns an object of type Product. Creator may also define a default implementation of the factory method that returns a default ConcreteProduct object. may call the factory method to create a Product object. ConcreteCreator (TKundeContainer) overrides the factory method to return an instance of a ConcreteProduct.

43  Jens Bennedsen 2002Objektorienteret systemudvikling Facade Facade mønsteret simplificerer tilgangen til en samling relaterede objekter ved at lave ét objekt som alle objekter udefra bruger til at kommnikere med samlingen af objekter Et eksempel – e-mail oprettelse og afsendelse –MassageBody – kroppen af beskeden –Attachment – ting der kan attaches til en besked –MessageHeader – overskriften til beskeden (subject line) –Security – tilføjelse af evt. digital signatur –MasseageSender - afsenderen

44  Jens Bennedsen 2002Objektorienteret systemudvikling En model Dette kunne klares af følgende model:

45  Jens Bennedsen 2002Objektorienteret systemudvikling løsning

46  Jens Bennedsen 2002Objektorienteret systemudvikling Plug-in algorithms (strategy) Nogle algoritmer/operationer er ”avancerede” – der skal være flere forskellige måder at implementere dem på Strategi: 1.Find brugbar funktionalitet der skal være udskiftbar 2.Tilføj et ”plug-in” punkt vha. et interface 3.Identificer implementører

47  Jens Bennedsen 2002Objektorienteret systemudvikling Eksempel Denne ide er også kendt som ”strategy pattern” ”Skal kunne” på flere måder

48  Jens Bennedsen 2002Objektorienteret systemudvikling Implementation public class Text { public void ombryd() { Iterator i = lnkParagraf.iterator(); while (i.hasNext()) { Paragraf p = ((Paragraf)(i.next())); p.update(lnkOmbryd.ombryd(p)); } … }

49  Jens Bennedsen 2002Objektorienteret systemudvikling Sammenfatning om mønstre Præsenterer en konkret løsningsstruktur for tilbage-vendende designproblemer. Dokumenterer velafprøvede designerfaringer. Specificerer strukturer og begreber over niveauet for de enkelte klasser og objekter. Beskriver struktur og opførsel af samarbejdende objekter. Giver et fælles ordforråd og en fælles begrebsforståelse. Adresserer specifikke kvalitetsegenskaber ved problemets løsning.

50  Jens Bennedsen 2002Objektorienteret systemudvikling Typisk struktur for et mønster Klient Abstrakt/ deferred klasse Konkret klasse Abstrakt/ deferred klasse Konkret klasse Definerer interface og eventuelt implementation Implmenterer interfacet fra superklassen (m.m.) Tilføjer evt. ny funktionalitet som gensidigt kan benyttes

51  Jens Bennedsen 2002Objektorienteret systemudvikling Proces og ting Ethvert mønster fortæller hvad man skal gøre, dvs. hvilken struktur der skal skabes og hvilken opførsel der skal være i denne struktur. Et mønster fortæller hvordan man skal benytte det ved at beskrive en proces som hjælper med at skabe strukturen. Eksempel: Observer –Identificer Subject og Observers –Tilføj registreringsfunktionalitet til Subject –Tilføj Observer-repository til Subject –Tilføj update-funktionalitet til Observers –Implementer Subjects “change propagation mechanism”

52  Jens Bennedsen 2002Objektorienteret systemudvikling Mønstre er generiske To implementationer af et mønster er sandsynligvis for-skellige. Et mønster giver en generisk løsning (en løsningsstruk-tur); mønsteret er ikke “hugget i sten”. Et mønster er et mentalt designværktøj; man kan benytte en løsningsstruktur igen og igen hvor hver implementa-tion er forskellig, men alle deler den samme kerne. Et mønster introducerer roller, IKKE klasser! (En klasse kan ofte spille roller i flere mønstre.)


Download ppt " Jens Bennedsen 2002Objektorienteret systemudvikling Gode designløsninger GOF designmønstre."

Lignende præsentationer


Annoncer fra Google