Posted:      Updated:

자바 디자인 패턴 스터디를 하며 ‘Java 객체 지향 디자인 패턴’ 교재를 정리한 글입니다.

데커레이터 패턴(Decorator Pattern)

  • 추가 기능의 조합을 설계
  • 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우 사용하는 방식
  • 각 추가 기능을 Decorator 클래스로 정의 후 필요한 Decorator 객체를 조합

데커레이터 패턴 컬레보레이션

  • Component
    • 클라이언트에서 실제 객체를 사용하기 위한 클래스
    • ConcreteComponentDecorator 의 공통 기능 정의
  • ConcreteComponent
    • 기본 기능을 구현
  • Decorator
    • ConcreteDecorator 클래스들의 공통 기능 제공
  • ConcreteDecorator
    • Decorator 의 하위 클래스
    • 기본 기능에 추가되는 개별적인 기능 제공

예시: 도로 표시 방법 조합

  • 네비게이션에서 기본 기능으로 도로를 표시
  • 차선, 교통량, 교차로를 표시하는 추가 기능이 있음
  • 각 추가 기능별로 개별적인 클래스 설계 후 기능을 조합할 때 객체 조합을 이용
  • Display : Component
  • RoadDisplay : ConcreteComponent
  • DisplayDecorator : Decorator
  • LaneDecorator, TrafficDecorator, CrossingDecorator : ConcreteDecorator

전체 코드

public abstract class Display {
    public abstract void draw();
}

public class RoadDisplay extends Display {
    @Override
    public void draw() {
        System.out.println("기본 도로 표시");
    }
}

public abstract class DisplayDecorator extends Display {
    private Display decoratedDisplay;

    public DisplayDecorator(Display decoratedDisplay) {
        this.decoratedDisplay = decoratedDisplay;
    }

    @Override
    public void draw() {
        decoratedDisplay.draw();
    }
}

public class LaneDecorator extends DisplayDecorator {
    public LaneDecorator(Display decoratedDisplay) {
        super(decoratedDisplay);
    }

    @Override
    public void draw() {
        super.draw();
        drawLane();
    }

    private void drawLane() {
        System.out.println("\t차선 표시");
    }
}

public class TrafficDecorator extends DisplayDecorator {
    public TrafficDecorator(Display decoratedDisplay) {
        super(decoratedDisplay);
    }

    @Override
    public void draw() {
        super.draw();
        drawTraffic();
    }

    private void drawTraffic() {
        System.out.println("\t교통량 표시");
    }

}

public class CrossingDecorator extends DisplayDecorator {
    public CrossingDecorator(Display decoratedDisplay) {
        super(decoratedDisplay);
    }

    @Override
    public void draw() {
        super.draw();
        drawCrossing();
    }

    private void drawCrossing() {
        System.out.println("\t교차로 표시");
    }
}

public class Main {
    public static void main(String[] args) {
        Display roadWithCrossingAndLaneAndTraffic = new LaneDecorator(
                new TrafficDecorator(new CrossingDecorator(new RoadDisplay())));
        roadWithCrossingAndLaneAndTraffic.draw();
    }
}

출력

기본 도로 표시
	교차로 표시
	교통량 표시
	차선 표시

댓글남기기