#format java /** * DecoratorPattern example */ abstract class Display { public abstract int getColumns(); public abstract int getRows(); public abstract String getRowText(int row); public final void show() { for(int i=0; i < getRows(); i++) { System.out.println(getRowText(i)); } } } class StringDisplay extends Display { private String string; public StringDisplay(String string) { this.string = string; } public int getColumns() { return string.getBytes().length; } public int getRows() { return 1; } public String getRowText(int row) { if(row == 0) { return string; } else { return null; } } } abstract class Border extends Display { protected Display display; protected Border(Display display) { this.display = display; } } class SideBorder extends Border { private char borderChar; public SideBorder(Display display, char ch) { super(display); this.borderChar = ch; } public int getColumns() { return 1 + display.getColumns() + 1; } public int getRows() { return display.getRows(); } public String getRowText(int row) { return borderChar + display.getRowText(row) + borderChar; } } class FullBorder extends Border { public FullBorder(Display display) { super(display); } public int getColumns() { return 1 + display.getColumns() + 1; } public int getRows() { return 1 + display.getRows() + 1; } public String getRowText(int row) { if(row == 0) { return "+" + makeLine('-', display.getColumns()) + "+"; } else if(row == display.getRows()+1) { return "+" + makeLine('-', display.getColumns()) + "+"; } else { return "|" + display.getRowText(row-1) + "|"; } } private String makeLine(char ch, int count) { StringBuffer buf = new StringBuffer(); for(int i=0; i < count; i++) { buf.append(ch); } return buf.toString(); } } public class DecoratorDisplay { public static void main(String[] args) { Display b1 = new StringDisplay("Hello, world."); Display b2 = new SideBorder(b1, '#'); Display b3 = new FullBorder(b2); b1.show(); b2.show(); b3.show(); Display b4 = new SideBorder( new FullBorder( new FullBorder( new SideBorder( new FullBorder(b1), '*' ) ) ), '/' ); b4.show(); } }