Decorator Pattern이란?

▶객체에 추가적인 책임을 동적으로 부여합니다. 데코레이터는 서브클래싱(상속)을 사용하지 않아도 유연하고 융통성 있는 기능 확장을 가능하게 합니다.

 

클래스 다이어그램과 코드로 확인하겠습니다. 

코드의 흐름은 String에 문자열이 점점 추가되는 형태입니다. Decoator를 상속받은 Add 객체들이 자신이 추가해야 할 부분을 추가하여 return 해줍니다. 마지막인 Printer 객채는 print()를 통해 꾸며진 String을 return 하여 출려해줍니다.

1. Decorator abstract class

public abstract class Decorator extends Printer{
    public abstract String print();
}

2. AddEnglish

public class AddEnglish extends Decorator {


    private Printer printer;

    public AddEnglish(Printer printer) {
        this.printer = printer;
    }

    @Override
    public String print() {
        StringBuilder sb = new StringBuilder();
        String string = printer.print();
        sb.append("H").append(string).append("H");
        return sb.toString();
    }
}

3. AddStar class

public class AddStar extends Decorator{

    private Printer printer;

    public AddStar(Printer printer) {
        this.printer = printer;
    }

    @Override
    public String print() {
        StringBuilder sb = new StringBuilder();
        String string = printer.print();
        sb.append('*').append(string).append('*');
        return sb.toString();
    }
}

4. AddZero class

public class AddZero extends Decorator{


    private Printer printer;

    public AddZero(Printer printer) {
        this.printer = printer;
    }

    @Override
    public String print() {
        StringBuilder sb = new StringBuilder();
        String string = printer.print();
        sb.append(0).append(string).append(0);
        return sb.toString();
    }
}

5. Printer class

public class Printer {

    private String string;


    public void setString(String string) {
        this.string = string;
    }

    public String print(){
        return string;
    }
}

6. Main class

public class Main {
    public static void main(String[] args) {

        Printer printer = new Printer();
        printer.setString("real");
        printer = new AddEnglish(printer);
        printer = new AddZero(printer);
        printer = new AddStar(printer);

        String print = printer.print();
        System.out.println(print);
    }
}

 

7. 결과

꾸미는 순서의 반대로 꾸며지는 것을 알 수 있습니다.

지금까지 Decorator Pattern을 알아보았습니다. 다음은 Factory Pattern에 관하여 포스팅하겠습니다. 감사합니다. 

전체 코드는 아래에서 확인 가능합니다:)

https://github.com/rlaehdals/design-pattern

 

GitHub - rlaehdals/design-pattern

Contribute to rlaehdals/design-pattern development by creating an account on GitHub.

github.com