정보처리기사
[정보처리기사] 정처기 재수 3일차 : Decorator패턴 (java)
h-yujin
2022. 9. 26. 12:56
Decorator
- 기존에 구현되어 있는 클래스에 필요한 기능을 추가해 나가는 설계 패턴
- 상속의 대안
- 객체의 결합을 통해 기능을 동적으로 유연하게 확장
java 예시

- Component : 기본 기능을 가지는 ConcreteComponent와 추가 기능을 가진 Decorator 의 공통 기능을 가진다.
- ConcreteComponent : 기본 기능을 구현하는 클래스
- Decorator : 추가 기능을 구현하는 하위 클래스들의 공통기능을 가진다.
- Decorator의 하위 클래스 : 개별 기능을 구현한다.
도로 표시 기능 구현하기

- Component : Display 기본 도로 표시 기능을 가진다.
- ConcreteComponent: RoadDisplay 기본 도로 표시기능을 구현한다.
- Decorator : DisplayDecorator 하위 클래스들의 공통 기능을 가진다.
- LaneDecorator : 차선 표시
- TrafficDecorator : 교통량 표시
Display
public abstract class Display { public abstract void draw(); }
RoadDisplay
public class RoadDisplay extends Display {
@Override
public void draw() { System.out.println("기본 도로 표시"); }
}
DisplayDecorator
public abstract class DisplayDecorator extends Display {
private Display decoratedDisplay;
// '합성(composition) 관계'를 통해 RoadDisplay 객체에 대한 참조
public DisplayDecorator(Display decoratedDisplay) {
this.decoratedDisplay = decoratedDisplay;
}
@Override
public void draw() { decoratedDisplay.draw(); }
}
- Display타입의 필드를 선언하여 Display클래스와 합성 관계를 맺는다.
LaneDecorator
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차선 표시"); }
}
- 기본 기능을 표시하고 추가로 drawLane을 구현하여 기본 기능과 함계 추가 기능을 제공한다.
TrafficDecorator
public class TrafficDecorator extends DisplayDecorator{
public TrafficDecorator(Display decoratorDisplay){
super(decoratorDisplay);
}
@Override
public void draw(){
super.draw();
drawTraffic();
}
public void drawTraffic(){
System.out.println("\\t교통량 표시");
}
}
사용법
public class Client {
public static void main(String[] args) {
Display road = new RoadDisplay();
road.draw(); // 기본 도로 표시
Display roadWithLane = new LaneDecorator(new RoadDisplay());
roadWithLane.draw(); // 기본 도로 표시 + 차선 표시
Display roadWithTraffic = new TrafficDecorator(new RoadDisplay());
roadWithTraffic.draw(); // 기본 도로 표시 + 교통량 표시
}
}
https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html
[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io