Decoratorパターン

row - 1でハマる。

% find . -name "*.java" -print0 |xargs -0 cat                                []
public abstract class Border extends Display {
	protected Display display;

	protected Border(Display display) {
		this.display = 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));
		}
	}

}
public class FullBorder extends Border {
	public FullBorder(Display display) {
		super(display);
	}

	@Override
	public int getColumns() {
		return 1 + display.getColumns() + 1;
	}

	@Override
	public int getRows() {
		return 1 + display.getRows() + 1;
	}

	@Override
	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();
	}

}
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		Display d1 = new StringDisplay("Hello World.");
		Display d2 = new SideBorder(d1, '#');
		Display d3 = new FullBorder(d2);
		d1.show();
		d2.show();
		d3.show();

		Display d4 = new MultiStringDisplay(Arrays.asList("aaaa", "bbbbbb",
				"ccccccccccc"));
		Display d5 = new SideBorder(d4, '#');
		Display d6 = new FullBorder(d5);
		d4.show();
		d5.show();
		d6.show();
	}

}
import java.util.ArrayList;
import java.util.List;

public class MultiStringDisplay extends Display {
	List<String> list = new ArrayList<String>();
	private int maxLen = 0;

	public MultiStringDisplay(List<String> list) {
		for (String str : list) {
			this.list.add(str);
			int l = str.getBytes().length;
			if (maxLen < l) {
				maxLen = l;
			}
		}
	}

	@Override
	public int getColumns() {
		return maxLen;
	}

	@Override
	public int getRows() {
		return list.size();
	}

	@Override
	public String getRowText(int row) {
		String format = "%1$" + maxLen + "s";
		return String.format(format, list.get(row));
	}
}
public class SideBorder extends Border {
	private char borderChar;

	public SideBorder(Display display, char ch) {
		super(display);
		this.borderChar = ch;
	}

	@Override
	public int getColumns() {
		return 1 + display.getColumns() + 1;
	}

	@Override
	public int getRows() {
		return display.getRows();
	}

	@Override
	public String getRowText(int row) {
		return borderChar + display.getRowText(row) + borderChar;
	}

}
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;
		}
	}

}
Hello World.
#Hello World.#
+--------------+
|#Hello World.#|
+--------------+
       aaaa
     bbbbbb
ccccccccccc
#       aaaa#
#     bbbbbb#
#ccccccccccc#
+-------------+
|#       aaaa#|
|#     bbbbbb#|
|#ccccccccccc#|
+-------------+