HT1 2015, FÖRELÄSNING

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

HT1 2013, FÖRELÄSNING

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

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

The billion dollar mistake

The billion dollar mistake

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

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

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

HT1 2013, FÖRELÄSNING 5

Tentamen i Objektorienterad modellering och design Helsingborg

Föreläsning 2. Länkad lista och iterator

Föreläsning 2. Länkad lista och iterator

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Information. Computer

OOP Objekt-orienterad programmering

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

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

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

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

Länkade strukturer. (del 2)

LÖSNINGSFÖRSLAG

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

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

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

Föreläsning 4 Innehåll

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

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

Repetition av OOP- och Javabegrepp

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

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

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Repetition av OOP- och Javabegrepp

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

Objektorienterad Programmering (TDDC77)

Designmönster. Kapitel Kommandomönstret

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

HT1 2015, FÖRELÄSNING

HT1 2015, FÖRELÄSNING

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

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

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

Tentamen Programmering fortsättningskurs DIT950

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 13 Innehåll

LULEÅ TEKNISKA UNIVERSITET

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

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Lösningar till tentamen i EDAF25

Tentamen i Objektorienterad modellering och design

Tentamen i Objektorienterad modellering och design Helsingborg

TDDD78 Viktiga begrepp, del 2

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

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

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Samlingar Collection classes

Objektsamlingar i Java

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Föreläsning 8: Exempel och problemlösning

Generisk klass med typparameter Inre klass - ListIterator

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Föreläsning 5-6 Innehåll

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

DAT043 - Föreläsning 7

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 1

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

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Objektorienterad Programmering (TDDC77)

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

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.

Grafer. Objektorienterad modellering och design (EDAF25) Föreläsning 2. Grafer. Grafer Traversering Djupet först. Agenda. Grafer

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Transkript:

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2015, FÖRELÄSNING 4 Förra föreläsningen Designmönster: Command Composite Template Method Strategy UML: Objekt- och Sekvensdiagram Projektet Computer EDAF10/EDA061 HT2014, Ulf Asklund 1

Dagens agenda Designmönster Strategy (repetition och exempel) Singleton Null object Facade Decorator ISP Interface Segregation Principle Muterbar vs. Ej muterbar Intro till Payroll Ø Hur går övningarna? Ø Projektgrupp klar och redovisningstid inbokad?! Lista med utskrift public class List<T> extends ArrayList<T> { public String tostring() { StringBuilder builder = new StringBuilder(); for (T t : this) { builder.append(t).append( \n ); return builder.tostring(); public String tostringstar() { StringBuilder builder = new StringBuilder(); for (T t : this) { builder.append( * ); builder.append(t).append( \n ); return builder.tostring(); EDAF10/EDA061 HT2014, Ulf Asklund 2

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(); Strategiklasserna public interface Prefix { public String string(); public class Empty implements Prefix { public String string() { return ; 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) + ; EDAF10/EDA061 HT2014, Ulf Asklund 3

Jojo-kort med två strategier public class TravelCard { private Tariff tariff; //Strategy public void settariff(tariff tariff) { this.tariff = tariff; public double price(int zones, Rebate rebate) { double amount = tariff.price(zones); return rebate.price(amount); Två strategi-interface public interface Tariff { public double price(int zones); public interface Rebate { public double price(double price); EDAF10/EDA061 HT2014, Ulf Asklund 4

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; 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); EDAF10/EDA061 HT2014, Ulf Asklund 5

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. Singleton Syfte: att det bara skall kunna skapas en instans av klass Hackerns (en som inte följer principer) favoritmönster EDAF10/EDA061 HT2014, Ulf Asklund 6

Konventionell Singleton public class Singleton { private static Singleton instance = null; // other attributes omitted private Singleton() { // omissions public static Singleton instance() { if (instance == null) { instance = new Singleton(); return instance; // other methods omitted Singleton Subklasser till en Singleton är inte automatiskt en Singleton Bieffekt av den konventionella implementeringen: instansen blir ett globalt åtkomligt objekt. Globala objekt är bekväma att använda men innebär i regel dålig design. På nästa övning skall vi implementera Singleton-mönstret utan att skapa globalt tillgängliga objekt. EDAF10/EDA061 HT2014, Ulf Asklund 7

Konventionell länkad lista public class Node { private Object object; private Node next; public Node next() { return next; public class List { private Node first; public int length() { int length = 0; Node node = first; while (node!= null) { length++; node = node.next(); return length; NULL Detta är en maskerad form av instanceof. next() är en getter. Node saknar intelligens. EDAF10/EDA061 HT2014, Ulf Asklund 8

Den skyldige: Tony Hoare Null Object Introduktionen av null i objektorienterade språk var ett fundamentalt misstag. null modellerar något som inte finns. Länkade listor och träd avslutas ofta med null. Null är inget objekt; att använda null för att representera ingenting är ett exempel på icke-objektorienterad programmering. EDAF10/EDA061 HT2014, Ulf Asklund 9

Null object Programkoden blir enklare om man istället använder ett riktigt objekt. Detta är ett exempel på mönstret Null Object. Objektorienterad beskrivning: En lista är antingen tom eller består av en nod med ett element som är ett Object och en svans som är en lista. Objektorienterad representation public interface List { public int length(); public class Empty implements List { public int length() { return 0; public class Node implements List{ private Object object; private List tail; public int length() { return 1 + tail.length(); EDAF10/EDA061 HT2014, Ulf Asklund 10

Objektorienterad listimplementering Man ersätter iteration med rekursion; det gör programmet logiskt enklare; testet av det logiska villkoret i while-satsen försvinner. I nästan alla sammanhang är det bra design att representera något som är tomt med ett riktigt objekt. ISP - Segregation Interface Segregation Principle Classes should not be forced to depend on methods that they do not use. EDAF10/EDA061 HT2014, Ulf Asklund 11

Java.util.Collection public interface Collection<E> extends Iterable<E> { int size(); boolean isempty(); boolean contains(object o); Iterator<E> iterator(); Object[ ] toarray(); <T> T[ ] toarray(t[ ] a); boolean add(e e); boolean remove(object o); boolean containsall(collection<?> c); boolean addall(collection<? extends E> c); boolean removeall(collection<?> c); void clear(); boolean equals(object o); int hashcode(); Collection javadoc The destructive methods contained in this interface, that is, the methods that modify the collection on which they operate, are specified to throw UnsupportedOperationException if this collection does not support the operation. If this is the case, these methods may, but are not required to, throw an UnsupportedOperationException if the invocation would have no effect on the collection. For example, invoking the addall(collection) method on an unmodifiable collection may, but is not required to, throw the exception if the collection to be added is empty. [Josh Bloch, Neal Gafter] EDAF10/EDA061 HT2014, Ulf Asklund 12

Collection bryter mot ISP Alla som implementerar gränssnittet måste ha metoder som inte behöver fungera. Hur borde det se ut? Hur borde det se ut? public interface Collection<E> extends Iterable<E> { int size(); boolean isempty(); boolean contains(object o); Iterator<E> iterator(); Object[ ] toarray(); <T> T[ ] toarray(t[ ] a); boolean containsall(collection<?> c); boolean equals(object o); int hashcode(); EDAF10/EDA061 HT2014, Ulf Asklund 13

Hur borde det se ut? public interface ImmutableCollection<E> extends Collection<E> { public interface MutableCollection<E> extends Collection<E> { boolean add(e e); boolean remove(object o); boolean addall(collection<? extends E> c); boolean removeall(collection<?> c); void clear(); Vad tycker Josh och Neal? Jag tror att de håller med. De har skrivit en bok som visar att Java har många brister och konstigheter. Joshua Bloch, Neal Gafter: Java Puzzlers Traps, pitfalls, and corner cases. Addison-Wesley, 2005, ISBN 0-321-33678-X. Länk: www.javapuzzlers.com EDAF10/EDA061 HT2014, Ulf Asklund 14

Kort repetition Integritetsprincipen Gör attribut, metoder och klasser så hemliga de går. Lämna inte ut representationen i onödan. En klass skall inte ha tillgång till klasser som den inte behöver. Begränsa synligheten genom att använda : private, bara klassen kan se paketsynlighet, klasser i paketet kan se protected, subklasser och klasser i paketet kan se. public, hela världen kan se. EDAF10/EDA061 HT2014, Ulf Asklund 15

Exponera inte representationen Exponerad: public class Figure extends ArrayList<Shape> { public void paint(graphics graphics) { for (Shape shape : this) { shape.paint(graphics); Ej exponerad: public class Figure { private List<Shape> list = new ArrayList<Shape>(); public void paint(graphics graphics) { for (Shape shape : list) { shape.paint(graphics); Exponera inte representationen, forts. Utlämnad representation: public class Figure { private List<Shape> list; public void paint(graphics graphics) { for (Shape shape : list) { shape.paint(graphics); public List<Shape> list() { return list; EDAF10/EDA061 HT2014, Ulf Asklund 16

(nästan) Förbud instanceof static getters Men det finns tillfällen när instanceof, static och getters är nödvändiga och det enda rätta:... instanceof public final class Integer extends Number implements Comparable<Integer> { private final int value; public boolean equals(object object) { if(object instanceof Integer) { Integer other = (Integer) object; return value == other.value; return false; // omissions Här finns inget bättre sätt. EDAF10/EDA061 HT2014, Ulf Asklund 17

2D-punkter (från första föreläsningen) public class Point2d implements Point { private double x, y; public double distanceto(point point) { Point2d other = (Point2d) point; double dx = this.x other.x; double dy = this.y other.y; return Math.sqrt(dx dx + dy dy); static public static main(string arg[]) public final static double PI public static double sin(double a) public class Outer { private static class Inner { Språkets design kräver static main. Ibland finns det inget tillhörande objekt. Inre klasser bör helst vara static. EDAF10/EDA061 HT2014, Ulf Asklund 18

getters Det finns ett exempel i Computer-projektet där en getter ger en bättre helhetsdesign. Observer-mönstret behöver i regel getters. Ibland måste man kompromissa när principerna drar åt olika håll. Spekulativ design Fool me once shame on you Fool me twice shame on me. Skriv program som om förutsättningarna inte kommer att förändras. Om detta ändå sker så implementera abstraktioner som skyddar mot framtida förändringar av samma slag. Take the first bullet and protect yourself from the second bullet from the same gun. EDAF10/EDA061 HT2014, Ulf Asklund 19

Exempel Uppdragsgivaren vill ha en lista av Item-objekt: Exempel, forts. Uppdragsgivaren vill senare ha en lista som innehåller Item1- objekt och Item2-objekt. Detta är första skottet; nu garderar vi oss mot ett liknande skott: EDAF10/EDA061 HT2014, Ulf Asklund 20

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. T ex så använder man inte strategimönstret om det inte finns minst två strategier. Muterbart vs. Ej muterbart EDAF10/EDA061 HT2014, Ulf Asklund 21

Muterbara vs. Ej muterbara objekt Ett objekt vars tillstånd kan förändras kallas muterbart (mutable). När objektet modellerar någonting i verkligheten som har ett tillstånd som kan förändras så är det rimligt att modellen har samma egenskap. Muterbara vs. Ej muterbara objekt, forts Ett objekt vars tillstånd inte kan förändras kallas omuterbart (immutable). När ett objektet modellerar någonting i verkligheten vars tillstånd inte kan förändras så är det rimligt att modellen har samma egenskap. Integer-objekt och String-objekt är omuterbara. EDAF10/EDA061 HT2014, Ulf Asklund 22

Exempel En omuterbar klass: public final class Num implements Expr { private int value; public value() { return value; En muterbar klass: public class Counter { private int counter; public increment() { counter++; Recept för omutbarhet Klassen måste vara final. Attributen måste vara privata. Attributen får ej vara muterbara. Inga metoder får förända attribut. Fördelar: Säkrare Behöver ej kopieras, kan delas Enklare att resonera om EDAF10/EDA061 HT2014, Ulf Asklund 23

Aktivitet public final class SafeContainer { private final Object object; public SafeContainer(Object object) { this.object = object; public String tostring() { return object.tostring(); Är klassen muterbar? Payroll - fallstudie EDAF10/EDA061 HT2014, Ulf Asklund 24

Systembeskrivning Vissa anställda arbetar på timbasis. Deras timlön finns i anställningsposten. De lämnar in tidkort med datum och antal timmar. Lönen utbetalas fredagar. Vissa anställda har fast lön som utbetalas sista vardagen varje månad. Vissa anställda med fast lön får också provision baserad på kvitton med datum och belopp med löneutbetalning varannan fredag. Lön utbetalas antingen via postanvisning till angiven adress, direkt till konto på bank, eller avhämtas på lönekontoret. Systembeskrivning Vissa anställda tillhör fackföreningen. Deras anställningskort innehåller veckoavgift. Föreningen kan debitera serviceavgifter för enskilda medlemmar. Avgifter dras från nästa lön. Transaktioner till systemet behandlas en gång om dagen och uppdaterar en databas. Löneutbetalningar genereras varje avlöningsdag. EDAF10/EDA061 HT2014, Ulf Asklund 25

Användningsfall 1 Lägg till en ny anställd. 2 Ta bort en anställd 3 Registrera ett tidkort 4 Registrera ett försäljningskvitto 5 Registrera en föreningsavgift 6 Ändra anställningsinformation 7 Generera löneutbetalningar Use case diagram EDAF10/EDA061 HT2014, Ulf Asklund 26

Use case diagram med arv Martins bok övergripande design kapitel 18 i Martin Implementering kapitel 19 i Martin med C++. Implementering med Java i Payroll.zip via föreläsningssidan. EDAF10/EDA061 HT2014, Ulf Asklund 27

Databasen enligt Martin Databasen är en implementeringsdetalj. Moduler skall bero på abstraktioner (DIP). Definiera ett gränssnitt (API)! Facade-mönstret Employee DB + get(int): Employee + put(int, Employee): Employee + remove(int): Employee Application Generic DB + <many generic methods> + EDAF10/EDA061 HT2014, Ulf Asklund 28

Designmönster - Facade Designmönster: Mediator (läs i boken) Databas implementering för testning public interface Database { public Employee put(int key, Employee employee); public Employee get(int key); public Employee remove(int key); public class TestDatabase implements Database { private Map<Integer, Employee> employees = new HashMap<Integer, Employee>(); public Employee get(int empid) { return employees.get(empid); public Employee remove(int empid) { return employees.remove(empid); public Employee put(int empid, Employee employee) { return employees.put(empid, employee); EDAF10/EDA061 HT2014, Ulf Asklund 29

Employee - Det finns tre sorters anställda Design utan eftertanke Vad är problemet? Användningsfall: en timanställd blir löneanställd Vad är problemet? Om en timanställd blir löneanställd så måste man skapa ett nytt objekt och kopiera data från det gamla. Bättre design? Designmönster? EDAF10/EDA061 HT2014, Ulf Asklund 30

Strategy Anställningsformen är en strategi Employee EDAF10/EDA061 HT2014, Ulf Asklund 31

Decorator-mönstret Skånetrafiken vill få en lista på alla köp av biljetter under oktober. Standardautomaten: public interface PaySation { public double pay(travelcard travelcard, int zones); public StandardPayStation implements PayStation { private double sum; public double pay(travelcard travelcard, int zones) { double price = travelcard.price(zones); sum += price; return price; Nu vill Skånetrafiken under vissa tider kunna logga vilket kort som används och antal zoner för varje köp. HUR? Decorator-mönstret Den nya funktionaliteten: public LoggingPayStation implements PayStation { private PayStation paystation; private List<String> log; public LoggingPayStation(PayStation paystation, List<String> log) { this.paystation = paystation; this.log = log; public double pay(travelcard travelcard, int zones) { log.add(travelcard.tostring() + zones); return paystation.pay(travelcard, zones); EDAF10/EDA061 HT2014, Ulf Asklund 32

Loggningen kan göras dynamiskt PayStation standardpaystation = new StandardPayStation(); PayStation paystation = standardpaystation; I början av oktober lägger vi till loggningen: paystation = new LoggingPayStation(standardPayStation); I slutet av oktober tar vi bort den: paystation = standardpaystation; Tillståndet i standardpaystation bevaras. Decorator-mönstret i Reader-klasserna reader = new BufferedReader(new FileReader(fileName)); public class BufferedReader extends Reader { private Reader in; // omissions EDAF10/EDA061 HT2014, Ulf Asklund 33

Decorator EDAF10/EDA061 HT2014, Ulf Asklund 34