十二、decorator装饰和内容一视同仁
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));
}
}
}
public class StringDisplay extends Display {
private String string;
public StringDisplay(String string) {
this.string = string;
}
@Override
public int getColumns() {
return string.getBytes().length;
}
@Override
public int getRows() {
return 1;
}
@Override
public String getRowText(int row) {
if (row==0){
return string;
}else {
return null;
}
}
}
public abstract class Border extends Display{
protected Display display;
public Border(Display display) {
this.display = display;
}
}
public class FullBorder extends Border {
public FullBorder(Display display) {
super(display);
}
public int getColumns(){
return 1+display.getColumns()+1;
}
public int getRows(){
return 1+1+display.getRows();
}
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 chars, int count) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < count; i++) {
buffer.append(chars);
}
return buffer.toString();
}
}
public class SideBorder extends Border {
private char borderChar;
public SideBorder(Display display, char borderChar) {
super(display);
this.borderChar = borderChar;
}
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;
}
}
public class Test {
public static void main(String[] args) {
StringDisplay joanna = new StringDisplay("joanna");
SideBorder sideBorder = new SideBorder(joanna, '@');
FullBorder fullBorder = new FullBorder(joanna);
joanna.show();
sideBorder.show();
fullBorder.show();
Display composite=new SideBorder(new FullBorder(new SideBorder(new FullBorder(new StringDisplay("zhouzhou")),'$')),'#');
composite.show();
}
}