ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 헤드 퍼스트 디자인 패턴 - 3장 객체 꾸미기 - 데코레이터 패턴
    도서 2023. 7. 27. 21:26

    3. 객체 꾸미기 - 데코레이터 패턴

    커피 가격 시스템으로 알아보자

    추상 클래스 Beverage 를 만들고 모든 음료가 이를 상속하도록 구현했다

    하지만 이는 고객의 커스텀 주문으로 인해 레시피가 바뀌고 그에 따라 가격이 변동되는 부분을 개별 클래스로 만들어 처리해야 하기 때문에 각 사례에 맞는 수 많은 클래스들이 필요했다

    만약 인스턴스 변수를 추가한 상속으로 관리해보려고 한다면?


    이렇게 5개의 클래스로 끝낼 수 있다고 생각했다

    과연 성공적인 구현 방법일까?

    OCP

    Open-Closed Principle

    클래스는 확장에서는 열려 있어야 하지만 변경에는 닫혀 있어야 한다

    기존 코드를 건드리지 않고 확장으로 새로운 행동을 추가하는 것을 목표로 한다

    새로운 기능을 추가할 때 유연하고 잘 적응하는 디자인을 만들 수 있다

    데코레이터 패턴

    위에서 말한 OCP 를 생각한다면 상속으로 음료 가격과 첨가물 가격을 합해 총 가격을 산출하는 방법은 그리 좋지 못했다

    확장하려면 무조건 기존 `Beverage` 클래스를 건드려야 한다

    또한 클래스가 너무 많아지거나 일부 서브 클래스에는 적합하지 않은 기능을 추가해야 했다

    특정 음료에 첨가물로 장식하는 것으로 생각해보자

    래퍼 객체라고 생각하면 더 편하다

    • DarkRoast 객체로 시작
    • Mocha 객체로 DarkRoast 를 감싸고
    • Whip 객체로 Mocha 객체를 감싼다

    DarkRoast 에 Mocha 와 Whip 을 추가한 주문을 구현한 것이다

    가격은 각 객체별로 cost 메소드를 호출하면서 감싼 객체의 cost 메소드를 호출하여 반환된 값을 더하여 반환하면 된다

    • 데코레이터의 슈퍼 클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같다
      • 같은 슈퍼클래스를 갖기 때문에 원래 객체 자리에 데코레이터 객체를 넣어도 된다
    • 한 객체를 여러 개의 데코레이터로 감쌀 수 있다
    • 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 일 말고도 추가 작업을 할 수 있다
    • 언제들 감쌀 수 있으므로 실행 중 필요한 데코레이터를 마음대로 적용할 수 있다

    객체에 추가 요소를 동적으로 더할 수 있어 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다

    커피 가격 시스템에 적용하면

    이런 클래스 다이어그램으로 적용된다

    어디에 사용되었는가?

    java.io 클래스

    InputStream 이 데코레이터 패턴으로 구현되어 있다

    OutputStream, Reader, Writer 도 마찬가지 이다.

    데코레이터 패턴은 많은 클래스를 만들어 낸다

    따라서 데코레이터를 알고 있고 구성을 이해해야 잘 사용할 수 있다

    출처

    도서 - 헤드 퍼스트 디자인 패턴

    코드

    https://github.com/sinna94/head-first-design-patterns

    반응형

    댓글

Designed by Tistory.