https://refactoring.guru/ko/design-patterns/decorator
https://durimongboksil.tistory.com/36 → super생성자 이유!
- 대상 객체 대한
- 기능 확장
- 변경 필요
대상 객체에 대한 기능 확장, 변경 필요 시 객체 결합을 통해 서브클래싱 대신 쓸 수 있는 유연한 대안 구조 패턴
원본 객체에 무언가 장식해 더 멋진 기능 가지도록 하는것이기 때문에 데코레이터 패턴.
- 데코레이터 패턴 사용 시
- 추가 기능의 조합을 런타임에서 동적으로 생성 가능
- 데코할 대상 객체를 새로운 행동들 포함한 특수 장식자 객체에 넣어서 행동들을 해당 장식자 객체마다 연결킴
- 기능 구현하는 클래스 분리 → 수정 용이

Example Code(ㅎㄷ)
interface Window {
void draw();
String getDescription();
}class SimpleWindow implements Window{
@Override
void draw(){
// blah blah
}
@Override
String getDescription(){
return "simple window";
}
}데코레이터 for Window Class!!!
abstract class WindowDecorator implements Window{
private final Window windowToBeDecorated;
public WindowDecorator (Window windowToBeDecorated){
this.windowToBeDecorated = windowToBeDecorated;
}
@Override
void draw(){
windowToBeDecorated.draw(); // Delegation!!!
}
@Override
String getDescription(){
windowToBeDecorated.getDescription(); // Delegation !!!~
}
}//first concrete decorator
class VerticlalScrollBarDecorator extends WindowDecorator {
public VerticlalScrollBarDecorator (Window windowToBeDecorated){
super(windowToBeDecorated);
}
@Override
void draw(){
super.draw();
drawVerticalScrollBar();
}
private void drawVerticalScrollBar(){
//balh~~
}
@Override
public String getDescription() {
return super.getDescription() + ", including vertical scrollbars";
}
}class DecoWindowTest{
public static void main(String[] args){
Window decoratedWindow = new HoarizonalScrollBarDecorator(new VerticlaScrollBarDecorator(new SimpleWindow()));
}
}