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()));
	}
}