I tried to implement a simple Decorator Pattern in Java. The main idea is that a concrete decorator have to add something to the basic list. However, my implementation doesnt work correctly and I dont know why.
The output is as you see below:
ING -1,ING 0,ING 1.
but it should be:
ING -1,ING 0,ING 1, ING 2.
Heres my code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package newpackage;
import java.util.ArrayList;
import java.util.List;
abstract class Tester {
protected List<String> ingridients = new ArrayList();
protected String description;
public String getDescription() {
description = "";
for (String i : ingridients) {
description += i;
description += ",";
}
description = description.substring(0, description.length() - 1);
description += ".";
return description;
}
}
abstract class Decorator extends Tester {
@Override
public abstract String getDescription();
}
class Test1 extends Tester {
public Test1() {
this.ingridients.add("ING -1");
this.ingridients.add("ING 0");
}
}
class Ing1 extends Decorator {
private Tester t;
public Ing1(Tester t) {
this.t = t;
}
@Override
public String getDescription() {
this.t.ingridients.add("ING 1");
return this.t.getDescription();
}
}
class Ing2 extends Decorator {
private Tester t;
public Ing2(Tester t) {
this.t = t;
}
@Override
public String getDescription() {
this.t.ingridients.add("ING 2");
return this.t.getDescription();
}
}
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Tester t = new Test1();
t = new Ing1(t);
t = new Ing2(t);
System.out.println(t.getDescription());
}
}
Edited code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package newpackage;
import java.util.ArrayList;
import java.util.List;
interface Tester {
List<String> ingridients = new ArrayList();
public String getDescription();
}
abstract class Decorator implements Tester {
@Override
public abstract String getDescription();
}
class Test1 implements Tester {
public Test1() {
ingridients.add("ING -1");
ingridients.add("ING 0");
}
@Override
public String getDescription() {
String description = "";
for (String i : ingridients) {
description += i;
description += ",";
}
description = description.substring(0, description.length() - 1);
description += ".";
return description;
}
}
class Ing1 extends Decorator {
private Tester t;
public Ing1(Tester t) {
this.t = t;
}
@Override
public String getDescription() {
this.t.ingridients.add("ING 1");
return this.t.getDescription();
}
}
class Ing2 extends Decorator {
private Tester t;
public Ing2(Tester t) {
this.t = t;
}
@Override
public String getDescription() {
this.t.ingridients.add("ING 2");
return this.t.getDescription();
}
}
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Tester t = new Test1();
t = new Ing1(t);
t = new Ing2(t);
System.out.println(t.getDescription());
}
}
I run this in a debugger and I could see that your Decorators are not just decorators as they have state of their own. Make your
Testeran interface and have you decorators only wrap the concrete instances and not have state of their own.At the end t.ingredients has three items, t1.ingredients has 1 element and t2.ingredients has none.
You could write it this way
prints