public class HelloDecorator { interface ICharacter { String print(); } static class H implements ICharacter { @Override public String print() { return "H"; } } static class W implements ICharacter { @Override public String print() { return "W"; } } static abstract class CharacterDecorator implements ICharacter { private final ICharacter inner; public CharacterDecorator(ICharacter inner) { this.inner = inner; } @Override public String print() { return inner.print(); } } static class E extends CharacterDecorator { public E(ICharacter inner) { super(inner); } @Override public String print() { return super.print() + "E"; } } static class L extends CharacterDecorator { public L(ICharacter inner) { super(inner); } @Override public String print() { return super.print() + "L"; } } static class O extends CharacterDecorator { public O(ICharacter inner) { super(inner); } @Override public String print() { return super.print() + "O"; } } static class R extends CharacterDecorator { public R(ICharacter inner) { super(inner); } @Override public String print() { return super.print() + "R"; } } static class D extends CharacterDecorator { public D(ICharacter inner) { super(inner); } @Override public String print() { return super.print() + "D"; } } public static void main(String[] args) { ICharacter hello = new O(new L(new L(new E(new H())))); ICharacter world = new D(new L(new R(new O(new W())))); System.out.println(hello.print() + " " + world.print()); } }