-
[정보처리기사] 정처기 재수 3일차 : Decorator패턴 (java)정보처리기사 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
'정보처리기사' 카테고리의 다른 글
[정보처리기사] 응용 SW 기초 기술 활용 (0) 2022.10.13 [정보처리기사] 디자인패턴: FlyWeight (java) (0) 2022.10.08 [정보처리기사] 정처기 재수 2일차: Bridge 패턴(java) (1) 2022.09.24 [정보처리기사] 정처기 재수 1일차 : 요구사항 확인 (0) 2022.09.23