정보처리기사

[정보처리기사] 정처기 재수 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