不断地为对象添装饰的设计模式被称为Decorator模式
类图

Display
public 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));}}}
StringDisplay
public class StringDisplay extends Display {private String string;public StringDisplay(String str) {this.string = str;}@Overridepublic int getColumns() {return string.getBytes().length;}@Overridepublic int getRows() {return 1;}@Overridepublic String getRowText(int row) {if (row == 0) {return string;} else {return null;}}}
Border
public abstract class Border extends Display {protected Display display;protected Border(Display display) {this.display = display;}}
SideBorder
public class SideBorder extends Border {private char borderChar;public SideBorder(Display display, char borderChar) {super(display);this.borderChar = borderChar;}@Overridepublic int getColumns() {return 1 + display.getColumns() + 1;}@Overridepublic int getRows() {return display.getRows();}@Overridepublic String getRowText(int row) {return borderChar + display.getRowText(row) + borderChar;}}
FullBorder
public class FullBorder extends Border {public FullBorder(Display display) {super(display);}@Overridepublic int getColumns() {return 1 + display.getColumns() + 1;}@Overridepublic int getRows() {return 1 + display.getRows() + 1;}@Overridepublic 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();}}
类图

拓展思路的要点
在Decorator模式中,装饰边框与被装饰物具有一致性。即使被装饰物被装饰起来,接口(API)也不会被隐藏起来。其他类依然可以调用getColumns、getRows、getRowText以及show方法。这就是接口的”透明性”。
java.io包
