Desig möster
Möster Visitor Decorator Extesio Object State Taskmaster
Visitor Aväds för komplicerade datastrukturer där det fis e växade mägd operatioer på dea Grafik exempel ige: Shape draw() ps() ik() svg() 0..* Lie Ci rcle Rec tagle Group draw() ps() ik() svg() draw() ps() ik() svg() draw() ps() ik() svg() draw() ps() ik() svg()
Visitor Varje y operatio kräver ädrig av varje subklass Problem då y fuktioalitet ska sättas till i ett existerade system Klasser blir ertygda med operatioer Operatioera har ite ödvädigtvis mycket gemesamt
Visitor Itroducera e visitor för varje fuktio ShapeVisitor visit(l : Lie) visit(c : Circle) visit(r : Rectagle) visit(g : Group) DrawVisitor Ikvisitor PsVisitor SvgVisitor
Visitor Klasshierarki för Shapes får u följade struktur Shape 0..* accept(s v : ShapeVisitor) Lie Circle Rec tagle Group accept() accept() accept() accept()
Visitor Varje accept metod är implemeterad på följade sätt: public void accept(shapevisitor v){ v.visit(this); } Group klasse skickar dessutom besökare vidare till sia gruppmedlemmar: public void accept(shapevisitor v){ for ( Shape s : members) s.accept(v); v.visit(this); }
Visitor Nu är det lätt att få operatioer utförda på godtyckligt komplicerade Shape strukturer exempel: koverterig av ritig till postscript Shape complexdrawig; complexdrawig=//...bygge av komplex ritig ShapeVisitor ps=ew ShapeVisitor(); complexdrawig.accept(ps);
Visitor Exempel på ekel Shape hierarki ps : PsVisitor complexdrawig : Group : Lie : Circle Arope av metoder i objekte illustreras av följade sekvesdiagram:
Visitor acliet ps : ShapeVisitor : Circle : Lie complexdrawig : Group 1: accept(ps) 2: acc ept(ps) 3: visit(this) 4: accept(ps) 5: visit(this) 6: visit(this)
Visitor - Sammafattig Separerar datastrukture frå operatioera på de Ska edast avädas då datastrukture (Shape hierarki) är stabil Om datastrukture ädras är Visitor gaska meigslös Visitor förhidrar att datastrukturklassera blir fyllda av diverse orelaterade operatiosuppsättigar som var och borde spridas ut i varje datastrukturklass Plugis för ya operatioer
Decorator Om ma vill utöka beteedet hos e klass ka det ske med arv Ka ite ädras dyamiskt Vill ma ge ett objekt flera ya egeskaper vid körige fugerar ite arv Bättre om objektet behåller sitt gamla grässitt och bara utökas med ya egeskaper
Decorator Föster för att visa kompoet Cotaier cotetpae getcotetpae(); JTextArea textarea =ew JTextArea(200,200); cotetpae.add(textarea); TextArea kaske ite får plats i föstret Dekorerar med rullister Cotaier cotetpae getcotetpae(); JTextArea textarea =ew JTextArea(200,200); JScrollPAe scrollpae=ew JSCrollPae(textArea); cotetpae.add(scrollpae);
Decorator Visar bara rullister är föstret är för litet JScrollPae, Cotaier och JTextArea ärver Compoet De igåede objektes grässitt bevaras De utökade fuktioalitete är ett ret tillägg
Decorator Javas IO-arkitektur BufferedReader i =ew BufferedReader(ew FileReader( text.txt )); Strig lie= i.readlie(); Olika streams för läsig ka kopplas ihop på flera sätt Reader read() close() FileReader BufferedReader PushbackReader
Decorator geerellt Compoet operatio() CocreteCompoet Decorator CocreteDecorator1 addedstate CocreteDecorator2 addedbehaviour()
Decorator - sammafattig Större flexibilitet och dyamik ä statiskt arv Varje kombiatio av dekoratioer skulle behöva e ege klass Fuktioalitet ka läggas till efter had E dekorator är ite idetisk med origialobjektet äve om de har samma grässitt Ka bli problem med jämförelseoperatioer Ma ka få måga objekt att hålla reda på (jämför java.io paketet)
Extesio object Varje objekt i e hierarki håller reda på e lista av extesio objekts Mera komplicerat ä decorator Me också mera flexibelt 0..* Part getextesio() addextesio() <<Map<Strig,PartExtesio>>> <<marker>> PartExtesio <<iterface>> PartExtesio1 Assempl y PiecePart AssemplyExtesio1 PiecePartExtesio1
State Implemetatio av ädlig tillstådsmaski (fiite state automata) Erbjuder ett ekelt och elegat sätt att beskriva beteedet för komplicerade system. Avädbart till allt frå grafiska avädargrässitt till kommuikatiosprotokoll
State Exempel: Parkerigsautomat Två hädelser euro: Sätter i e euro i automate ticket: Begär att ma får e parkerigsbiljett Reaktioe på hädelsera är olika beroede på tillståd idle euro / icsum() ticket / givetick et() euro / icsum() coiiserted
Tillståds maskier (Statemachies) Här består de av Hädelser (evets) Hädelser frå omvärlde som maskie reagerar på Tillståd (states) Reaktioe på e hädelse bestäms av tillstådet som maskie befier sej i Aktioer (actios) Aktioer beskriver de effekt som e hädelse har på omgivige då maskie är i ett visst tillståd
State Iformatioe ka också preseteras i tabellform euro ticket idle coiiserted idle coiiserted coiiserted idle
State - Implemetatio Switch case public void euro(){ switch ( state) { case IDLE: state=coin_inserted; icsum(); break; case COIN_INSERTED; icsum(); break; } } public void ticket(){...}
State - Implemetatio Ekelt och sabbt sätt att implememtera FSMs Fugerar bra för små tillstådsmaskier Stora swítch-case block blir ofta oöverskådliga och svåra att hatera Dålig separatio mella logike för tillstådsförädrigar och aktioer
State - Trasitiostabell Ka också implemeteras som tabell motsvarade tabell represetatioe av tillstådsmaskie
State - implemetatio Ekelt att översätta frå tabellrepresetatio av tillstådsmaskie Lätt att uderhålla jämfört med switch-case Ekelt att ädra beteedet hos tillstådsmaskie då programmet körs Nackdelar: Lågsam Det tar tid att söka i tabeller E hel del kod måste skrivas för att få allt och fuka
State - möster ParkigTicketDispeser state icsum() giveticket() <<iterface>> ParkigState euro(p : ParkigTicketDispeser) ticket(p : ParkigTicketDispeser) Idle CoiIserted
State - implemetatio Implemetatio av IDLE tillstådet class Idle implemets State{ } public void euro(parkigticketdispeser p){ p.icsum(); p.setcoiisertedstate(); } public void ticket(){ }
State - geerellt Cotext state actio1() actio2() <<iterface>> State evet1() evet2() evet3() S1 S2 S3
State Bra separerig mella aktioer och logike för trasitioer mella tillståd Lätt att ädra e uta att påverka de adra Sabbare ä tabell Ataglige lika sabbt som switch-case Bästa egeskapera av båda tidigare lösigara Nackdelar Kräver e del arbete att skapa alla State subklasser - Måga metoder gör igetig Ige cetralt ställe att för att få överblick över logike svårt att uderhålla
UML statemachies s1 r1 etry/ AR1 exit/ AR2 do/ AR3 e2[ G2 ] / A2 ^E2 e1( p1,p2 )[ G1 ] / A1 s2 e3 e4 H r2
Taskmaster Arkitektur för att hatera komplicerade sekveser av hädelser Aväder tillstådsmaskier Olika uppgifter (=tasks) Exempel: MeasureTask Mäter avstådet mella två pukter i ett ritprogram Avädare markerar vilka två pukter
Taskmaster Tillstådsmaski beskriver iteraktioe GettigPoits / Iit Get FirstPoit MovePoit GetPoit / RecordEdPt GetPoit / RecordStartPt Cacel / ClearTask MovePoit / DragLi e DoubleClick Get SecodPoit MouseUp