티스토리 뷰

dev_note/TIL

데코레이터 패턴

jjoylee 2021. 7. 10. 17:07

데코레이터 패턴

  • 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴 (기능 확장)

구성

  1. Component
  • ConcreteComponent와 Decorator가 구현할 인터페이스
  • 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의
  • 클라이언트는 Component를 통해 실제 객체를 사용함
public interface Display {
    void draw();
}
  1. ConcreteComponent
  • 기본 기능을 구현하는 클래스
public class RoadDisplay implements Display {
    @Override
    public void draw() {
        System.out.println("Road Display"); // 기본 기능
    }
}
  1. Decorator
  • Decorator의 공통기능 제공
// 추가 기능에 대한 공통 쿨래스
public class DisplayDecorator implements Display {

    private Display decoratedDisplay;

    public DisplayDecorator(Display decoratedDisplay){
        this.decoratedDisplay = decoratedDisplay;
    }

    @Override
    public void draw() {
        decoratedDisplay.draw(); // 기본 기능 실행
    }
}
  1. ConcreteDecorator
  • Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능
public class TrafficDecorator extends DisplayDecorator{

    // 기본 기능 클래스 설정 
    public TrafficDecorator(Display decoratedDisplay) {
        super(decoratedDisplay);
    }

    @Override
    public void draw() {
        super.draw(); // 공통 기능 수행, DispayDecorator의 draw 메소드 실행
        drawTraffic(); // 이 데코레이터만의 개별 기능, 추가 기능 : Draw Traffic 출력
    }

    private void drawTraffic() {
        System.out.println("Draw Traffic");
    }
}
  1. Client
public class DecoratorMain {
    public static void main(String[] args){
        Display roadWithTraffic = new TrafficDecorator(new RoadDisplay());
        roadWithTraffic.draw();
        // 출력 결과
        // Road Display
        // Draw Traffic
    }
}

프록시 패턴과 데코레이터 패턴의 차이

  • 프록시 패턴에서는 프록시 객체와 실제 객체의 관계가 컴파일타임에 정해진다.
  • 데코레이터 패턴에서는 Decorate와 Component의 관계가 런타임에 정해진다.
  • 프록시 패턴은 요청을 위임해주는데 의의가 있고, 데코레이터 패턴은 부가기능을 추가하는데에 있다.
  • 프록시 패턴에서 프록시는 기능에 대한 엑세스를 제어, 데코레이터는 기능을 추가한다.
  • UserServiceTx에서 UserServiceImpl의 메서드를 호출 : 프록시 패턴
  • new UserServiceTx(new UserService()) 트랜잭션 기능을 추가 : 데코레이터 패턴

Reference


https://diqmwl-programming.tistory.com/104
https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html
https://dailyheumsi.tistory.com/198
https://sabarada.tistory.com/60
https://eyevsky.tistory.com/entry/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%84%EB%A1%9D%EC%8B%9C-%ED%8C%A8%ED%84%B4

'dev_note > TIL' 카테고리의 다른 글

SQL 레벨업  (0) 2021.07.11
웹 개발자를 위한 웹을 지탱하는 기술  (0) 2021.07.11
프록시  (0) 2021.07.10
(최근본상품2)Problem Solving  (0) 2019.02.23
(최근 본 상품1) 쿠키에 데이터 넣기  (0) 2019.02.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함