You will be fine

<디자인패턴입문> 9. Decorator 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇인가

 a. 스펀지 케이크에 덧칠하듯!

  -  스펀지 케이크에 크림을 바르고 딸기를 얹고 초콜릿으로 장식하고 초를 꽃으면 생일케이크 완성

      => 이처럼 객체도 장식해 나가는 디자인 패턴을 데코레이터 패턴이라고 한다.

 

나. 만들어본 예제

 a. Component 역할

  -  기능이 추가되는 핵심이 되는 역할의 인터페이스

public interface Base {
    String cake();
}

 b. ConcreteComponent 역할 

  -  인터페이스를 구현하여 장식 되어질 실질적인 핵심이 되는 부분 

public class Cake implements Base{

    @Override
    public String cake() {
        return "스펀지케이크";
    }
}

 c. Decorator 역할

  -  Component 역할과 동일한 인터페이스를 가지면서 장식할 대상(Component)를 가지고 있는 추상클래스

  -  Decorator 역할을 Component 역할과 동일시 하는 가장 중요한 부분이다.

public abstract class Decorator implements Base {
    private Base base;

    public Decorator(Base base) {
        this.base = base;
    }

    @Override
    public String cake() {
        return base.cake();
    }
}
​

 d. ConcreteDecorator 역할

  -  실제 Decorator를 구현하여 장식하는 부분

public class Cream extends Decorator{

    public Cream(Base base) {
        super(base);
    }

    @Override
    public String cake() {
        return "크림|"+super.cake()+"|크림";
    }
}

public class Strawberry extends Decorator{
    public Strawberry(Base base) {
        super(base);
    }

    @Override
    public String cake() {

        StringBuilder sb = new StringBuilder();
        String cake = super.cake();
        int index = cake.indexOf("스펀지");
        for (int i = 0; i <= index; i++) {
            sb.append(" ");
        }
        sb.append("딸기딸기딸기\n");
        sb.append(cake);

        return sb.toString();
    }
}

 e. Main

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

        Base base = new Strawberry(new Cream(new Cake()));

        String complete = base.cake();

        System.out.println(complete);
    }
}

/** 실행

"C:\Program Files\Java\jdk-11.0.8\bin\java.exe"
	 딸기딸기딸기
크림|스펀지케이크|크림

Process finished with exit code 0


**/

 

다. 정리

 a. 투과적인 인터페이스.

  -  Composite와 닮은 재귀적인 구조가 등장, 내용물이 실제로는 다른 장식이 되는 구조

  -  데코레이터 패턴은 테두리 장식을 중복해서 기능을 추가해가는 것에 주안점을 둔다.

 

 b. 기능추가

  -  장식되는 내용물은 수정할필요가 없기 때문에 내용물을 변경하지 않고 기능을 추가할 수 있다.

  -  또한 위임 통해 구현하므로 런타임에 동적인 기능을 추가할 수 있다.

 

 c. Java I/O

  -  java.io 패키지에 패턴을 잘 사용한 부분이 있다.

  -  버퍼링을 할것인지 행번호를 관리할것인지 아니면 둘다 할 것인지를 데코레이터 패턴을 사용한것을 볼 수 있다.

Reader reader = new FileReader("test.txt");
Reader reader = new BufferedReader( new FileReader("test.txt"));
Reader reader = new LineNumberReader(new BufferedReader( new FileReader("test.txt")));
데코레이터 패턴은 내용물과 장식을 동일시하여 내용물을 꾸미는 패턴이다.
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기