도로 표시 방법에 대해 구현해보자
Display.class
public abstract class Display {
public abstract void draw();
}
RoadDisplay.class
public class RoadDisplay extends Display{
public void draw() { System.out.println("기본 도로 표시"); }
}
DisplayDecorator.class
public abstract class DisplayDecorator extends Display {
private Display decoratedDisplay;
public DisplayDecorator(Display decoratedDisplay) {
this.decoratedDisplay = decoratedDisplay;
}
@Override
public void draw() { decoratedDisplay.draw(); }
}
LaneDecorator.class
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차선 표시"); }
}
TrafficDecorator.class
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교통량 표시"); }
}
Main.class
public static void main(String[] args) {
Display roadWithLaneAndTraffic =
new TrafficDecorator(
new LaneDecorator(
new RoadDisplay()));
roadWithLaneAndTraffic.draw();
}
>>> 기본 도로 표시
차선 표시
교통량 표시
Client 클래스는 동일한 Display 클래스만을 통해 일관성 있는 방식으로 도로 정보를 표시할 수 있다.
참조: