[Design Pattern] 데커레이터 패턴(Decorator Pattern)
Posted: Updated:
자바 디자인 패턴 스터디를 하며 ‘Java 객체 지향 디자인 패턴’ 교재를 정리한 글입니다.
데커레이터 패턴(Decorator Pattern)
- 추가 기능의 조합을 설계
- 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우 사용하는 방식
- 각 추가 기능을
Decorator
클래스로 정의 후 필요한Decorator
객체를 조합
데커레이터 패턴 컬레보레이션
- Component
- 클라이언트에서 실제 객체를 사용하기 위한 클래스
ConcreteComponent
와Decorator
의 공통 기능 정의
- ConcreteComponent
- 기본 기능을 구현
- Decorator
ConcreteDecorator
클래스들의 공통 기능 제공
- ConcreteDecorator
Decorator
의 하위 클래스- 기본 기능에 추가되는 개별적인 기능 제공
예시: 도로 표시 방법 조합
- 네비게이션에서 기본 기능으로 도로를 표시
- 차선, 교통량, 교차로를 표시하는 추가 기능이 있음
- 각 추가 기능별로 개별적인 클래스 설계 후 기능을 조합할 때 객체 조합을 이용
Display
: ComponentRoadDisplay
: ConcreteComponentDisplayDecorator
: DecoratorLaneDecorator
,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();
}
}
출력
기본 도로 표시
교차로 표시
교통량 표시
차선 표시
댓글남기기