객체를 점점 꾸미듯이 확장하는 패턴을 말한다. 케익을 만들때 점점 쌓으면서 꾸미는 느낌과 같다
예시
new App(new SideBorder(new FullBorder(new SideBorder(new TextWidget("hello")))));
출력해야할 텍스트의 크기 및 출력할 열, 출력메소드등을 가지고있는 위젯의 상위 클래스를 만들어준다
public abstract class Widget {
public abstract int getColumns();
public abstract int getRows();
public abstract String getRowText(int row);
public void show() {
for (int i = 0; i < getRows(); i++) {
System.out.println(getRowText(i));
}
}
}
public class TextWidget extends Widget {
private String text;
public TextWidget(String text) {
this.text = text;
}
@Override
public int getColumns() {
//문자열의 길이
return text.length();
}
@Override
public int getRows() {
//한줄
return 1;
}
@Override
public String getRowText(int row) {
return row == 0 ? text : null;
}
}
private static void decorator() {
TextWidget textWidget = new TextWidget("hello");
textWidget.show();
new TextWidget("nice").show();
}
hello
nice
Widget 추상클래스를 상속받아서 구현해준다
public abstract class Border extends Widget{
//Border를 상속받은 클래스에서만 사용할 수 있도록 함
protected Widget widget;
public Border(Widget widget) {
this.widget = widget;
}
}
public class SideBorder extends Border{
public SideBorder(Widget widget) {
super(widget);
}
@Override
public int getColumns() {
return widget.getColumns() + 2;
}
@Override
public int getRows() {
return widget.getRows();
}
@Override
public String getRowText(int row) {
return "*" + widget.getRowText(row) + "*";
}
}
public class FullBorder extends Border
{
public FullBorder(Widget widget) {
super(widget);
}
@Override
public int getColumns() {
return widget.getColumns() + 2;
}
@Override
public int getRows() {
return widget.getRows() + 2;
}
@Override
public String getRowText(int row) {
// ---- 파트
StringBuilder str = new StringBuilder();
if (row == 0 || row == widget.getRows() + 1)
{
for (int i = 0; i < widget.getColumns()+2; i++) {
if (i == 0 || i == widget.getColumns() + 1)
str.append("+");
else
str.append("-");
}
}
// ||| 파트
else
str.append("|").append(widget.getRowText(row-1)).append("|");
return str.toString();
}
}
new FullBorder(new FullBorder(new SideBorder(new TextWidget("start")))).show();
+---------+
|+-------+|
||*start*||
|+-------+|
+---------+
new SideBorder(new FullBorder(new FullBorder(new SideBorder(new TextWidget("start"))))).show();
*+---------+*
*|+-------+|*
*||*start*||*
*|+-------+|*
*+---------+*
public class Scaffold {
public Scaffold (Widget widget){
widget.show();
}
}
new Scaffold(new SideBorder(new FullBorder(new FullBorder(new SideBorder(new TextWidget("start"))))));
*+---------+*
*|+-------+|*
*||*start*||*
*|+-------+|*
*+---------+*
UI를 짤때 레이아웃을 구성할때 많이 사용하는 방식이다