Desig möster
Desig möster Commad Active object Template method Strategy Facade Mediator
Commad Ett av de eklaste desig möstre Me också mycket avädbart Ett grässitt med e metod <<iterface>> Comm ad do()
Commad - exempel Behöver ite veta exakt vilket kommado Olika kommado ka behadlas av systemet på samma sätt <<iterface>> Comm ad do() RelayOCommad Mot oro RelayOffCommad MotorOff
Commad - exempel Kommado som drivs av sesor Sesor <<iterface>> Comm ad do() Sesor behöver ite veta ågot om kommadot Ka bytas ut är som helst Kommado associeras ite med sesor vid kompilerig, ka bytas ut dyamiskt Separerar fuktioe hos delara frå hopkopplige
Commad -exempel Emplyee <<iterface>> PayClassificatio calculatepay() CommissioedClassificatio SalariedClassificatio HourlyClassificatio 0..* SalesReceipt 0..* Tim ecard
Commad - Trasaktioer Ka avädas för att implemetera trasaktioer Ta emot data validera och köra <<iterface>> Trasactio validate() execute() Validerig Kolla att de aställda ite reda är i database osv AddEm ployeetras actio <<iterface>> PayClassificatio calculatepay() Physical decouplig separerar avädargrässitt frå logik Temporal decoublig Spara trasaktioer kör seare
Commad - udo do metod åtföljs av e udo metod i varje Commad objekt Varje kommado vet också hur ma ka udo kommadot Cliet UdoSy stem udostack <<iterface>> UdoableCommad do() udo() TextDocumet AddTextCom mad legth positio DeleteTextCpmmad deletedtext positio E stack udostack sparar slutförda kommado För att udo e operatio aropar ma udostack.pop().udo()
Commad Ivoker <<it erface>> Comm ad do() CCliet Receiver Cocrete Comm ad1 state CocreteCommad2 state
Commad Bra att aväda då ma har måga kommado Iga låga switch eller if-satser Lätt att skapa udo-, redo- fuktioalitet Lätt att skapa trasaktioer Ka samla kommado och köra vid seare tillfälle Frikopplar de som aropar kommado frå de som vet vad som ska göras Lätt att lägga till ya kommado uta att påverka gamla
Active Object Tekik för implemeterig av multipla kotrolltrådar Ekel variat där olika trådar samarbetar Ite egetlige parallell programmerig
Active Object class ActiveObjectEgie{ List<Commad> commads= ew LikedList<Commad>(); public void addcommad(commad c){ commads.add(c); } public void ru(){ while (!commads.isempty() ){ Commad c= commads.getfirst(); commads.removefirst(); c.do(); } }
Active Object Ite speciellt avädbart äu, me om... Kommado objekte skapar kopior av sej själv som sätts tillbaka på kö Kö blir aldrig tom ru metode avslutas aldrig
Active Object Exempel frå boke
Active object Valigt för multitrådade system Ru to completio trådar Trådar som körs tills de är färdiga Ka ite bli stoppade Bra för system med små miesresurser Eklare ä att aväda ä Javas ibyggda trådar Ige riktig parallellism iget problem med parallella accesser av data Behöver ite sykroiseras
Template method Ett valigt möster är att e metod deklareras som abstrakt i basklasse och seda överskuggas av subklass metodera. Det är saolikt att subklass metodera påmier mycket om varadra Grafik paket med Shape klass Sub-klassera Circle, Lie och Rectagle Abstrakt metod draw() i Shape Defiitioer är likade i alla versioer av draw Iitialisera grafikpaketet, välj färg, lijetjocklek, etc.
Template method Shape x y colour draw() drawstep() public fial void draw(){ iitgraphics(); setcolour(...) setlietype(...) drawstep(); exitgraphics(); } Circle Rectagle Lie drawstep() drawstep() drawstep()
Template method Implemetera delar som ite ädrar i basklasse Edast på ett ställe Subklassera defiierar bara de steg som faktiskt ädrar Ati-möster: Subklassera aropar gemesamma fuktioalitet basklasse
Template method - översikt AbstractClass templatemethod() primitivestep1() primitivestep2() CocreteClass1 primitiveste p1() primitiveste p() CocreteClass2 primitivestep1() primitivestep2() CocreteClass3 primitivestep1() primitivestep2()
Strategy E metod som är avsedd att styra beteedet hos aa kod Ite ödvädigtvis ågot som ka utföras som ett isolerat kommado Sorterig exempel sorterig av persoobjekt Iblad vill ma sortera på efteram, iblad på persoummer class Perso{... public Strig getlastname(){...} public Strig getnumber(){...}... }
Strategy Stöd för sorterig av objekt sampligar fis i klasse java.util.collectios klasse static <T> void sort( List<T> list, Comparator<? super T> c ) Färdigt grässitt för Strategy möstret public iterface Comparator<T> it compare(t t1, T t2); //... } Flera kokreta strategier
Strategy Sortera på efteram public class LastNameComparator implemets Comparator<Perso>{ public it compare(perso p1, Perso p2){ retur p1.getlastname().compareto(p2.getlastname()); } } Sortera på ummer public class NumberComparator implemets Comparator<Perso>{ public it compare(perso p1, Perso p2){ retur p1.getnumber().compareto(p2.getnumber()); } }
Strategy Ekelt att aväda List<Perso> c=ew ArrayList<Perso>() //fyll på med persoer Collectios.sort(c, ew LastNameComparator()); //... Collectios.sort(c, ew NumberComparator()); //... Sorterige oberoede av jämförelsekriteriet Flera olika kriterier ka lätt avädas
Strategy - geerell Cotext <<iterface>> St rat egy algorithm() CocreteStrategy1 Co cret estrateg y2 CocreteStrategy3
Strategy Avädbart för Separera utvalda algoritm delar så att dessa ka bytas ut efter behov Ha edast e implemetatio av algoritm, som ka apassas efter behov Ka avädas i stället för villkorad kod Udviker switch och if satser med alterativ de ka vara svåra att uderhålla Nackdelar med Strategy möstret Algoritmavädare tvigas veta om strategier Ka göra kode lågsammare
Facade Döljer komplexitet för avädara Lättare att aväda fasade ä de ursprugliga systemet Ofta ite lätt att utveckla fasade Målet med Facade möstret är att förekla Avädare ser bara fasade Ka byta implemetatio av det som fasade gömmer Midre beroede
Facade Det som ma vill dölja bakom e Facade ka vara komplext av olika skäl Ett gammalt bibliotek som har dålig struktur. Kaske utvecklats uder tiotals år, me måste avädas eftersom ma ite har resurser att skriva om. Operativsystem är komplexa system Om ett program ska kua avädas på flera operativsystem ka det vara e god ide att gömma plattform specifika fuktioer bakom e Facade
Facade - exempel Applicatio DB storeproduct() getproduct() deleteproduct() Pro ductdata java.sql
Facade - geerell FCliet Facade
Mediator Möster för att hatera beroede mella objekt Atalet parrelatioer mella objekt är (-1)/2. Nya objekt som iförs ska dessutom ite störa gamla iteraktioer : Collegue : Collegue : Collegue : Collegue : Collegue : Mediator : Collegue : Collegue : Collegue : Collegue : Collegue
Mediator Udviker kaos geom att cetralisera kommuikatiosstyrige Idividuella objekt ka föreklas då kommuikatioe mella dem försvier Ka iföra gemesamma regler för kommuikatioe
Mediator <<iterface>> Mediator <<iterface>> Collegue CocreteMediator CocreteCollegue1 CocreteCollegue2 Cocret ecollegu e3
Mediator Exempel i boke