본문 바로가기

Design Pattern/구조(Structural) 패턴

10. 데코레이터 패턴 / Decorator Pattern

목차

1. 데코레이터 패턴이란?

2. 데코레이턴 패턴 구조 예시

3. 코드 예시

4. 결과

5. 참조


데코레이터 패턴이란?

 

Decorator Pattern 에서 Decorator 는 "장식하는 사람" 을 뜻하며,

우리가 크리스마트 트리에 여러가지 물건들을 Decoration 하듯, 

기능을 계속해서 추가할 수 있는 패턴을 뜻합니다.

 

Decorator Pattern 을 사용하면 실행 중에 동적으로 변경 또는 확장을 할 수 있게 됩니다.

 


데코레이터 패턴 구조 예시

< Decorator Pattern Structure >

 

이름 내용
Item 내용물(Strings) 과 장식(Decorator )을 다루기 위한 클래스
Strings Class 장식할 대상이 되는 클래스
Decorator Class Strings 를 장식하는 클래스
SideDecorator, LineNumberDecorator 구체적인 장식을 구현한 클래스

 


코드 예시 - 문자열을 다양한 형태로 출력하는 기능

 

 

Item 클래스

public abstract class Item {
    public abstract int getLinesCount();
    public abstract  int getMaxLength();
    public abstract  int getLength(int index);

    public abstract String getString(int index);

    public void print() {
        int cntLines = getLinesCount();
        for(int i=0;i<cntLines;i++) {
            String string = getString(i);
            System.out.println(string);
        }
    }
}

 

 

Strings 클래스

public class Strings extends Item{
    private ArrayList<String> strings = new ArrayList<>();

    public void add(String item) {
        strings.add(item);
    }

    @Override
    public int getLinesCount() {
        return strings.size();
    }

    @Override
    public int getMaxLength() {
        Iterator<String> iter = strings.iterator();
        int maxWidth = 0;

        while(iter.hasNext()) {
            String string = iter.next();
            int width = string.length();

            if(width > maxWidth) maxWidth = width;
        }

        return maxWidth;
    }

    @Override
    public int getLength(int index) {
        String string = strings.get(index);
        return string.length();
    }

    @Override
    public String getString(int index) {
        String string = strings.get(index);
        return string;
    }
}

 

 

Decorator 클래스

public abstract class Decorator extends Item{
    protected Item item;

    public Decorator(Item item) {
        this.item = item;
    }
}

 

 

SideDecorator 클래스

public class SideDecorator extends Decorator{
    private Character ch;

    public SideDecorator(Item item, Character ch) {
        super(item);
        this.ch = ch;
    }

    @Override
    public int getLinesCount() {
        return item.getLinesCount();
    }

    @Override
    public int getMaxLength() {
        return item.getMaxLength() + 2;
    }

    @Override
    public int getLength(int index) {
        return item.getLength(index) + 2;
    }

    @Override
    public String getString(int index) {
        return ch + item.getString(index) + ch;
    }
}

 

 

LineNumberDecorator 클래스

public class LineNumberDecorator extends Decorator{

    public LineNumberDecorator(Item item){
        super(item);
    }

    @Override
    public int getLinesCount() {
        return item.getLinesCount();
    }

    @Override
    public int getMaxLength() {
        return item.getMaxLength() + 4;
    }

    @Override
    public int getLength(int index) {
        return item.getLength(index) + 4;
    }

    @Override
    public String getString(int index) {
        return String.format("%02d", index) + " : " + item.getString(index);
    }
}

 


결과

 

Main 클래스

 

기본 Strings 클래스로 출력

public class Main {

    public static void main(String[] args) {

        Strings strings = new Strings();
        strings.add("디자인 패턴");
        strings.add("Decorator Pattern");
        strings.add("데코레이터 패턴");
        strings.add("감사합니다.");

        strings.print();

    }
}

실행 결과

디자인 패턴
Decorator Pattern
데코레이터 패턴
감사합니다.

 

 

Decorator Pattern 사용

 

public class MainEntry {

    public static void main(String[] args) {

        Strings strings = new Strings();
        strings.add("디자인 패턴");
        strings.add("Decorator Pattern");
        strings.add("데코레이터 패턴");
        strings.add("감사합니다.");

//        strings.print();

        LineNumberDecorator lineNumberDecorator = new LineNumberDecorator(strings);
        lineNumberDecorator.print();

        System.out.println();

        SideDecorator sideDecorator = new SideDecorator(strings, '*');
        sideDecorator.print();

    }
}

실행 결과

00 : 디자인 패턴
01 : Decorator Pattern
02 : 데코레이터 패턴
03 : 감사합니다.

*디자인 패턴*
*Decorator Pattern*
*데코레이터 패턴*
*감사합니다.*

 


참조

 

https://www.youtube.com/watch?v=UTmY_oB4V8I&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=15