// Component interface Kaffe { String hentBeskrivelse(); double pris(); } // ConcreteComponent class EnkelKaffe implements Kaffe { public String hentBeskrivelse() { return "Enkel kaffe"; } public double pris() { return 20.0; } } // Decorator abstract class KaffeDecorator implements Kaffe { protected Kaffe decoratedKaffe; public KaffeDecorator(Kaffe k) { this.decoratedKaffe = k; } public String hentBeskrivelse() { return decoratedKaffe.hentBeskrivelse(); } public double pris() { return decoratedKaffe.pris(); } } // ConcreteDecorator class MedMelk extends KaffeDecorator { public MedMelk(Kaffe k) { super(k); } public String hentBeskrivelse() { return super.hentBeskrivelse() + ", med melk"; } public double pris() { return super.pris() + 5; } } class MedSukker extends KaffeDecorator { public MedSukker(Kaffe k) { super(k); } public String hentBeskrivelse() { return super.hentBeskrivelse() + ", med sukker"; } public double pris() { return super.pris() + 1; } } // Using the decorators public class KaffeDecoratorPatternDemo { public static void main(String[] args) { Kaffe enkelKaffe = new EnkelKaffe(); Kaffe melkKaffe = new MedMelk(enkelKaffe); Kaffe sukkerMelkKaffe = new MedSukker(melkKaffe); System.out.println(sukkerMelkKaffe.hentBeskrivelse() + " Pris: " + sukkerMelkKaffe.pris() + " kr"); } }