Föreläsning 8 Designmönster
Designmönster När man designar program kan det vara viktigt att förstå hur man tidigare gått till väga när man konstruerat program. Kännedom om dessa tillvägagångssätt kan snabba upp designprocessen och leda till bättre program i slutändan. Olika tillvägagångssätt att konstruera program kallas designmönster. Dessa är alltså bra lösningar till ett antal vanliga problem inom (objektorienterad) mjukvarudesign. Inspirationen till designmönster inom objektorienterad programmering kommer från arkitekturen där man använder olika arkitekturstilar vid husbygge. 2
Designmönster 1994 utkom Design Patterns, Elements of Reusable Object- Oriented Software av Gamma, Helm, Johnson och Vlissides. Boken lanserade idén om designmönster för mjukvaruutveckling. Den utgör en katalogisering av typiska problem och deras typiska lösningar. Boken är dock svår att läsa om man inte har programmerat mycket tidigare. 3
Designmönster Ingen ny Java-syntax krävs för att använda designmönster. Tre exempel på designmönster ges i boken: - Holder Pattern - Proxy Pattern - Composite Pattern 4
Första designmönstret Namn: Holder Pattern Problem: Ett objekt (A) måste kunna nås eller ändras av två eller flera klasser (klienter). (Jämför med globala variabler i andra programmeringsspråk.) Struktur: Skapa ett andra objekt (Holder-objekt) vars enda syfte är att innehålla objektet A och setoch get-metoder som klientobjekten kan använda. För- och nackdelar: Nackdelarna är att man måste skapa ett extra objekt och att ingen av klientobjekten kan komma åt A direkt. Fördelarna är att A är inkapslad, klassen för Holder-objektet är lätt att läsa och skriva och Holder-objektet förenklar koden för klientklasserna. 5
Holder Pattern SomeObjectHolder - _someobject: SomeObject + SomeObjectHolder() + getsomeobject(): SomeObject + setsomeobject(someobject): void Client1 Client2 Client3 6
Problemspecifikation: Problemexempel Create a frame with a rectangle and an ellipse, three radio buttons (red, blue, and green), and a quit button. Clicking on a radio button should change the current color (and make the button selected). When the user clicks on one of the shapes, the shape should appear selected, and the color of the shape should change to the current color. 7
Problemexempel Analys: green blue red Quit 8
Problemexempel Design: ColorHolderApp ColorShapePanel ColorHolder ControlPanel SmartRectangle SmartEllipse QuitButton ColorButton 9
Andra designmönstret Namn: Proxy Pattern Problem: Av olika anledningar vill man inte använda sig av ett objekt direkt (exempelvis kan objektet ändra sig från en tid till en annan). Man vill komma åt objektet men också få objektet att utföra något. Struktur: Skapa ett gränssnitt som definierar en roll, ett eller flera objekt (aktörer) som implementerar gränssnittet, ett proxy-objekt som också implementerar gränssnittet men som delegerar alla metodanrop till någon av aktörerna, samt ett eller flera klientobjekt. För- och nackdelar: Klientobjekten blir enklare. Nackdelarna är att man måste skapa ett extra objekt (proxy-objektet) och att ett extra metodanrop ska göras varje gång proxyn ska utföra något. 10
Proxy Pattern <<interface>> SomeRole SomeObject SomeObjectProxy - _someobject: SomeObject + SomeObjectProxy() + setsomeobject(someobject): void + All methods that the actor SomeObject has Client1 Client2 Client3 11
Skillnad mellan Holder och Proxy Om man behöver lagra ett värde som kan ändras (exempelvis en färg) och som andra objekt måste ha tillgång till då är det troligt att det är Holder-mönstret som ska användas. Om man behöver lagra ett värde som kan ändras och som man vill kunna skicka ett meddelande till för att något ska uträttas då ska man överväga Proxymönstret. 12
Problemspecifikation: Problemexempel Design a frame that contains two regions. One region should contain two pictures of cars. The other region should contain three buttons. Clicking on a car selects it and it remains selected until one clicks elsewhere in the region. Clicking a button makes the current car (if any) move to the right, move to the left, or stop. If no car is selected, clicking a button should have no effect. Once started, a car keeps moving until either (1) it reaches the edge of the region containing it or (2) the user selects it and clicks the stop button. 13
Problemexempel Analys: Reverse Stop Quit Forward 14
Problemexempel Design: CarProxyApp CarProxyPanel CarProxy ControlPanel MoveTimer Car QuitButton SpeedButton 15
Tredje designmönstret Namn: Composite Pattern Problem: Ett klient-objekt vill skicka ett meddelande till ett sammansatt objekt och få meddelandet förmedlat till objektets samtliga delar. Struktur: Skapa ett gränssnitt som definierar en roll, ett sammansatt objekt och dess delar (som också är objekt) som implementerar gränssnittet, samt ett eller flera klientobjekt. För- och nackdelar: Klientobjekten blir enklare. Lätt att lägga till fler komponenter (som i sin tur kan vara sammansatta) i det sammansatta objektet. Nackdelen är att det kan bli för lätt att lägga till komponenter (rörigt). 16
Composite Pattern <<interface>> SomeRole Client SomeObject1... SomeObjectN SomeObjectComposite - _someobject1: SomeObject1... - _someobjectn: SomeObjectN + SomeObjectComposite() + Methods in interface 17
Problemspecifikation: Problemexempel Design a frame with a space alien and a slider. The space alien bounces around the frame from one edge to another. Moving the slider sets the speed at which the alien bounces. The space alien should be composed of three ellipses. 18
Problemexempel Analys: 0 25 Quit 19