Föreläsningsbilder EDAF10/EDA061 Ht 2015 HT1 2015, FÖRELÄSNING 3

Relevanta dokument
Förra föreläsningen. Dagens agenda. Command Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Förra föreläsningen. Dagens agenda. Dagens agenda. Föreläsningsbilder EDAF10/EDA Ulf Asklund, Datavetenskap/LTH 1

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

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

HT1 2015, FÖRELÄSNING

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

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

4.7 Observatörsmönstret

Information. Computer

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

Lösningar till tentamen i EDAF25

HT1 2015, FÖRELÄSNING

Objektorienterad modellering och design (EDAF25) Föreläsning 5. Repetition Grafer Traversering bredden först med kö

LÖSNINGSFÖRSLAG

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

Förra föreläsningen. Dagens agenda. Jojo-kort med två strategier Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Lösningar till tentamen i EDAF25

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

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design

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

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design. Vad är Objektorienterad modellering?

HT1 2013, FÖRELÄSNING

Förra föreläsningen. Dagens agenda. Jojo-kort med två strategier Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Tentamen i Objektorienterad modellering och design

Tentamen i Objektorienterad modellering och design Helsingborg

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

EDAF10: Objektorienterad modellering och diskreta strukturer. EDA061: Objektorienterad modellering och design. Diskreta strukturer.

Seminarierna Instruktioner. Övningarna Viktiga relationer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Tentamen i Objektorienterad modellering och design Helsingborg

Designmönster. Kapitel Kommandomönstret

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design

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

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

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Kursstruktur. Objektorienterad modellering och diskreta strukturer / design. Programmering utan OMD. Vad är Objektorienterad modellering?

Objektorienterad Programmering (TDDC77)

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

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

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Tentamen i Objektorienterad modellering och diskreta strukturer

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 13 Innehåll

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

Tentamen i Objektorienterad modellering och diskreta strukturer

Kursstruktur. Objektorienterad modellering och diskreta strukturer / design. Vad är Objektorienterad modellering? Programmering utan OMD

Tentamen Programmering fortsättningskurs DIT950

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen i Objektorienterad modellering och diskreta strukturer

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Klasshierarkier - repetition

HT1 2013, FÖRELÄSNING 6

Förra föreläsningen. Alternativ kurslitteratur. Dagens agenda Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

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

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

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

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

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

Laboration 2: Designmönster

Lösningsförslag till tentamen

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

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Laboration 2: Designmönster

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

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Konstruktion av klasser med klasser

Projekt 2 XL. Observer-mönstret

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

Nej! Nej Nej Nej Nej Nej Nej Nej!

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

Kopiering av objekt i Java

TENTAMEN OOP

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

DAT043 - Föreläsning 7

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

Tentamen i EDAF oktober Skrivtid: Skriv bara på ena sidan av pappret tentorna kommer att scannas in, och endast framsidorna rättas.

LÖSNINGSFÖRSLAG. Tentamen. Objektorienterad modellering och design. EDA665, 4 poäng

OOP Objekt-orienterad programmering

TENTAMEN OOP

Laborationer, moment 4 5

HT2 2015, FÖRELÄSNING 15 (XL-PROJEKTET)

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Classes och Interfaces, Objects och References, Initialization

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Instuderingsuppgifter läsvecka 2

Transkript:

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2015, FÖRELÄSNING 3 Förra föreläsningen UML: klassdiagram God praxis (metodik), t ex Refaktorisera Design smells, t ex Bräcklighet (Fragility), Duplicerad kod Designprinciper ALP (Lokalitetsprincipen) SRP (Single Responsibility Principle) OCP (Open/Closed Principle) DIP (Dependency Inversion Principle) Designmönster: Command och Composite Ulf Asklund, Datavetenskap/LTH 1

Dagens agenda Repetition DIP Designmönster: Command och Composite (exempel) Template Method Strategy UML: Objekt- och Sekvensdiagram Projektet Computer Ø Övningarna börjar denna vecka! Ø Bilda projektgrupper och boka redovisningstid (pausen)! Dagens agenda Design Principer Mönster Arkitektur Computer-projektet (Metodik) UML O-O Eclipse Paket Klass Abstrakt klass Arv Gränssnitt Java Statisk metod Abstrakt metod Objekt Metod Virtuell metod Attribut Statiskt attribut Metodanrop Dynamisk bindning Virtulla metoder, polyformism Ulf Asklund, Datavetenskap/LTH 2

DIP Bero på abstraktion Dependency Inversion Principle High level classes should not depend on low level classes; both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions. UML-pilar skall gå mot gränssnitt och abstrakta klasser. Dependency Inversion Ulf Asklund, Datavetenskap/LTH 3

Command Command användning List<Command> commandlist = new ArrayList<Command>(); commandlist.add(new PenDown()); commandlist.add(new Move(1, 0)); commandlist.add(new Move(0, 1)); commandlist.add(new Move( 1, 0)); commandlist.add(new Move(0, 1)); commandlist.add(new PenUp()); for (Command command : commandlist) { command.execute(); Ulf Asklund, Datavetenskap/LTH 4

Kompositmönstret (Composite) Ni kommer ihåg Command Ulf Asklund, Datavetenskap/LTH 5

Ni kommer ihåg Comand Nu med Composite Composite public class Macro implements Command { private List<Command> commandlist = new ArrayList<Command>(); public void add(command command) { commandlist.add(command); public void execute() { for (Command IMPLEMENTERING? command : commandlist) { command.execute(); Ulf Asklund, Datavetenskap/LTH 6

Composite - enklare public class Macro extends ArrayList<Command> implements Command { public void execute() { for (Command command : this) { command.execute(); men med sämre integritet. Composite användning Macro macro = new Macro(); macro.add(new PenDown()); macro.add(new Move(2, 0)); macro.add(new Move(0, 2)); macro.add(new Move( 2, 0)); macro.add(new Move(0, 2)); macro.add(new PenUp()); macro.execute(); new Move(1, 1).execute(); macro.execute(); Ulf Asklund, Datavetenskap/LTH 7

UML: objekt- och sekvensdiagram Objektdiagram Ulf Asklund, Datavetenskap/LTH 8

Objektdiagram - Aktivitet (1 + 2) + 3 Sekvensdiagram :TCtoEmp Ulf Asklund, Datavetenskap/LTH 9

Sekvensdiagram Aktivitet (1 + 2) + 3 Visa beräkning av (1 + 2) + 3 i ett sekvensdiagram. Ulf Asklund, Datavetenskap/LTH 10

Sekvensdiagram Projektet Computer Ulf Asklund, Datavetenskap/LTH 11

Projektet Computer: Specifikation public class Computer { public Computer(Memory memory) public void load(program program) public void run() Projektet Computer: Test public static void main(string[] args) { Program factorial = new Factorial(); System.out.println(factorial); Computer computer = new Computer(new LongMemory(64)); computer.load(factorial); computer.run(); Ulf Asklund, Datavetenskap/LTH 12

Projektet Computer: Data public class Factorial extends Program { public Factorial() { Address n = new Address(0), fac = new Address(1); add(new Copy(new LongWord(5), n)); add(new Copy(new LongWord(1), fac)); add(new JumpEq(6, n, new LongWord(1))); add(new Mul(fac, n, fac)); add(new Add(n, new LongWord( 1), n)); add(new Jump(2)); add(new Print(fac)); add(new Halt()); Projektet Computer: Resultat 0 CPY 5 [0] 1 CPY 1 [1] 2 JEQ 6 [0] 1 3 MUL [1] [0] [1] 4 ADD [0] -1 [0] 5 JMP 2 6 PRT [1] 7 HLT 120 Ulf Asklund, Datavetenskap/LTH 13

Projektet Computer: Genomförande Redovisningstider ligger på hemsidan under Sam gruppindelning ) Registrera er grupp (alla gruppmedlemmar) på önskad redovisningtid Gruppen kommer att få e-post från sin handledare denna vecka med information om var och exakt när mötet äger rum. Projektet Computer: Genomförande Gruppen: 1. formulerar svaren på åtta frågor 2. gör en design med klass- och sekvensdiagram 3. skickar in klassdiagram och sekvensdiagram (24 timmar före mötet) 4. Förbereder en 3-minuters muntlig presentation av gruppens design 5. Träffar sin handledare för designmöte (15-18 september) 6. reviderar designen och implementerar 7. skickar in klassdiagram och källkod (senast 27 september) Merparten av projekttiden brukar behövas för designen. OBS glöm ej redovisa nerlagd tid (anonymt) Ulf Asklund, Datavetenskap/LTH 14

Designmönster Command Composite Template Method Strategy Klipp och klistra-orienterad programmering public class LoadMenuItem extends JMenuItem implements ActionListener { private final Gui gui; private String title; public LoadMenuItem(Gui gui, String title) { super(title); this.gui = gui; this.title = title; addactionlistener(this); public void actionperformed(actionevent event) { try { FileDialog dialog = new FileDialog(gui, title, FileDialog.LOAD); dialog.setvisible(true); String file = dialog.getfile(); String dir = dialog.getdirectory(); dialog.dispose(); String fullname = dir + file; gui.storage.load(new BufferedReader(new FileReader(fullName))); catch (IOException ex) { gui.statusarea.settext(ex.tostring()); Ulf Asklund, Datavetenskap/LTH 15

Kopian public class SaveMenuItem extends JMenuItem implements ActionListener { private final Gui gui; private String title; public SaveMenuItem(Gui gui, String title) { super(title); this.gui = gui; this.title = title; addactionlistener(this); public void actionperformed(actionevent event) { try { FileDialog dialog = new FileDialog(gui, title, FileDialog.SAVE); dialog.setvisible(true); String file = dialog.getfile(); String dir = dialog.getdirectory(); dialog.dispose(); String fullname = dir + file; gui.storage.save(new PrintStream(fullname)); catch (IOException ex) { gui.statusarea.settext(ex.tostring()); Eliminera duplicerad kod: Försök 1 Med en flagga: private boolean save; if(save) { gui.storage.save(new PrintStream(fullName)); else {... gui.storage.load(new BufferedReader( new FileReader(fullName))); Vilken princip bryter vi mot? Ulf Asklund, Datavetenskap/LTH 16

Eliminera duplicerad kod: Template method Bryt ut det som är gemensamt och placera det i en abstrakt superklass. Fyll hålen med anrop av abstrakta metoder som implementeras i subklasserna. Klassdiagram! Den gamla LoadMenuItem public class LoadMenuItem extends JMenuItem implements ActionListener { private final Gui gui; private String title; public LoadMenuItem(Gui gui, String title) { super(title); this.gui = gui; this.title = title; addactionlistener(this); public void actionperformed(actionevent event) { try { FileDialog dialog = new FileDialog(gui, title, FileDialog.LOAD); dialog.setvisible(true); String file = dialog.getfile(); String dir = dialog.getdirectory(); dialog.dispose(); String fullname = dir + file; gui.storage.load(new BufferedReader(new FileReader(fullName))); catch (IOException ex) { gui.statusarea.settext(ex.tostring()); Ulf Asklund, Datavetenskap/LTH 17

De nya subklasserna I superklassen protected abstract void action(storage storage, String fullname) throws IOException; och i hålet action(gui.storage, fullname); I LoadMenuItem public void action(storage storage, String fullname) { storage.load(new BufferedReader(new FileReader(fullName))); I SaveMenuItem Public void action(storage storage, String fullname) { storage.save(new PrintStream(fullName)); FileMenuItem public abstract class FileMenuItem extends JMenuItem implements ActionListener { private final Gui gui; private String title; protected FileMenuItem(Gui gui, String title) { super(title); this.gui = gui; this.title = title; addactionlistener(this); protected abstract void action( Storage storage, String fullname ) throws IOException; public void actionperformed(actionevent event) { try { FileDialog dialog = new FileDialog(gui, title, FileDialog.??); dialog.setvisible(true); String file = dialog.getfile(); String dir = dialog.getdirectory(); dialog.dispose(); String fullname = dir + file; action(gui.storage, fullname); catch (IOException ex) { gui.statusarea.settext(ex.tostring()); Ulf Asklund, Datavetenskap/LTH 18

Ena subklassen public class LoadMenuItem extends FileMenuItem { private String title; public LoadMenuItem(Gui gui, String title) { super(gui, title); protected void action(storage storage, String fullname) throws IOException { storage.load(new BufferedReader(new FileReader(fullName)); Aktivitet Använd Template method-mönstret för att hantera FileDialog.SAVE och FileDialog.LOAD. public abstract class FileMenuItem extends JMenuItem implements ActionListener { private final Gui gui; private String title; protected abstract void action( Storage storage, String fullname) throws IOException; public void actionperformed(actionevent event) { try { FileDialog dialog = new FileDialog(gui, title, FileDialog.SAVE); dialog.setvisible(true); String file = dialog.getfile(); String dir = dialog.getdirectory(); dialog.dispose(); String fullname = dir + file; action(gui.storage, fullname); catch (IOException ex) { gui.statusarea.settext(ex.tostring()); Ulf Asklund, Datavetenskap/LTH 19

Aktivitet - Lösning public abstract class FileMenuItem extends JMenuItem implements ActionListener { private final Gui gui; private String title; protected abstract void action ( Storage storage, String fullname) throws IOException; protected abstract int dialogkind(); public void actionperformed(actionevent event) { try { FileDialog dialog = new FileDialog(gui, title, dialogkind()); dialog.setvisible(true); String file = dialog.getfile(); String dir = dialog.getdirectory(); dialog.dispose(); String fullname = dir + file; action(gui.storage, fullname); catch (IOException ex) { gui.statusarea.settext(ex.tostring()); Template method Add- och Mul-klasserna i Expr innehåller duplicerad kod. Använd Template method-mönstret för att eliminera den! Ulf Asklund, Datavetenskap/LTH 20

Add public class Add implements Expr { private Expr expr1, expr2; public Add(Expr expr1, Expr expr2) { this.expr1 = expr1; this.expr2 = expr2; public int value() { return expr1.value() + expr2.value(); Mul public class Mul implements Expr { private Expr expr1, expr2; public Mul(Expr expr1, Expr expr2) { this.expr1 = expr1; this.expr2 = expr2; public int value() { return expr1.value() * expr2.value(); Ulf Asklund, Datavetenskap/LTH 21

Add & Mul public class Add implements Expr { private Expr expr1, expr2; public Add(Expr expr1, Expr expr2) { this.expr1 = expr1; this.expr2 = expr2; public int value() { return expr1.value() + expr2.value(); public class Mul implements Expr { private Expr expr1, expr2; public Mul(Expr expr1, Expr expr2) { this.expr1 = expr1; this.expr2 = expr2; public int value() { return expr1.value() * expr2.value(); BinExpr Gemensam superklass public abstract class BinExpr implements Expr { private Expr expr1, expr2; protected BinExpr(Expr expr1, Expr expr2) { this.expr1 = expr1; this.expr2 = expr2; protected abstract int op(int int1, int int2); public int value() { return op(expr1.value(), expr2.value()); Ulf Asklund, Datavetenskap/LTH 22

Add public abstract class BinExpr implements Expr { private Expr expr1, expr2; protected BinExpr(Expr expr1, Expr expr2) { this.expr1 = expr1; this.expr2 = expr2; protected abstract int op(int int1, int int2); public int value() { return op(expr1.value(), expr2.value()); public class Add extends BinExpr { public Add(Expr expr1, Expr expr2) { super(expr1, expr2); protected int op(int int1, int int2) { return int1 + int2; Template method Template method-mönstret är olämpligt att använda när det är mer än funktionalitet som kan variera. Om det i Expr-klasserna finns 5 olika operationer och 4 typer att räkna med (int, long, float, double) så blir det 4*5=20 subklasser. Använd Strategy-mönstret (kommer strax) för tillkommande funktionaliteter. Ulf Asklund, Datavetenskap/LTH 23

Strategy Strategimönstret användas när man vill kunna ändra hur en operation utförs under exekveringen av programmet; man byter strategi. Ett exempel visar hur man definierar strategier för att skriva ut listor med olika prefix. Strategy Först själva listan: public class List<T> extends ArrayList<T> { private Prefix prefix = new Empty(); public void setprefix(prefix prefix) { this.prefix = prefix; public String tostring() { StringBuilder builder = new StringBuilder(); for (T t : this) { builder.append(prefix.string()); builder.append(t).append( \n ); return builder.tostring(); Ulf Asklund, Datavetenskap/LTH 24

Strategin public interface Prefix { public String string(); Strategiklasserna public interface Prefix { public String string(); public class Star implements Prefix { public String string() { return ; public class Numbered implements Prefix { private int number; public String string() { number++; return String.valueOf(number) + ; Ulf Asklund, Datavetenskap/LTH 25

En variant av Strategy Normalt är strategin ett attribut i klassen, men man kan i stället skicka med den som ett argument till en metod som behöver den. public String tostring(prefix prefix) { StringBuilder builder = new StringBuilder(); for (T t : this) { builder.append(prefix.string()); builder.append(t).append( \n ); return builder.tostring(); Jojo-kort med två strategier public class TravelCard { private Tariff tariff; public double price(int zones, Rebate rebate) { double amount = tariff.price(zones); return rebate.price(amount); public void settariff(tariff tariff) { this.tariff = tariff; Ulf Asklund, Datavetenskap/LTH 26

Två strategi-interface public interface Tariff { public double price(int zones); public interface Rebate { public double price(double price); Två strategier public class Skane implements Tariff { public double price(int zones) { switch (zones) { case 1: return 17.0; default: return 7.0 * zones + 7.0; public class Family implements Rebate { public double price(double price) { return 1.5 *price; Ulf Asklund, Datavetenskap/LTH 27

Strategierna har inget tillstånd public final static Tariff SKANE = new Skane(); public final static Rebate DUO = new Family();... TravelCard jojo = new TravelCard(); jojo.settariff(skane); double price = jojo.price(3, DUO); Template method eller Strategy? Båda mönstren kan användas för att eliminera duplicerad kod. Använd Template method när funktionaliteten skall vara den samma under objektets hela livstid. Använd Strategy när funktionaliteten skall kunna förändras under livstiden eller när det finns mer än en funktionalitet som kan variera. Ulf Asklund, Datavetenskap/LTH 28

Strategimönstret används överallt Strategistrukturen återkommer ofta i sammanhang där namnet strategi kan vara konstigt. TANSTAAFL TANSTAAFL There ain t no such thing as a free lunch. (Martin, sidan 319) Att införa ett designmönster är inte gratis. Det måste finnas ett bra skäl att använda det. Man använder inte strategimönstret om det inte finns minst två strategier. Ulf Asklund, Datavetenskap/LTH 29

Ulf Asklund, Datavetenskap/LTH 30