Decorator 패턴

구름코딩·2020년 11월 1일

Java 디자인 패턴

목록 보기
9/12
정의

객체를 점점 꾸미듯이 확장하는 패턴을 말한다. 케익을 만들때 점점 쌓으면서 꾸미는 느낌과 같다

예시

new App(new SideBorder(new FullBorder(new SideBorder(new TextWidget("hello")))));

TextWidget 구현

Widget 추상클래스

출력해야할 텍스트의 크기 및 출력할 열, 출력메소드등을 가지고있는 위젯의 상위 클래스를 만들어준다

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));
        }
    }
}
Widget을 상속받은 TextWidget클래스
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

SideBorder 구현

Border를 위한 추상클래스 선언

Widget 추상클래스를 상속받아서 구현해준다

public abstract class Border extends Widget{
    
    //Border를 상속받은 클래스에서만 사용할 수 있도록 함
    protected Widget widget;

    public Border(Widget widget) {
        this.widget = widget;
    }
}
SideBorder _ 양쪽에 별을 찍어준다
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) + "*";
    }
}
FullBorder _ 테두리를 씌어준다
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*||*
*|+-------+|*
*+---------+*
show()를 최종 클래스로 감싸기
public class Scaffold {
    public Scaffold (Widget widget){
        widget.show();
    }
}

new Scaffold(new SideBorder(new FullBorder(new FullBorder(new SideBorder(new TextWidget("start"))))));
*+---------+*
*|+-------+|*
*||*start*||*
*|+-------+|*
*+---------+*

UI를 짤때 레이아웃을 구성할때 많이 사용하는 방식이다

profile
내꿈은 숲속의잠자는공주

0개의 댓글