[디자인 패턴] 데코레이터 패턴(Decorator Pattern) 개념 정리
Decorator Pattern - 데코레이터 패턴 (구조패턴 분류)
데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 객체에 추가적인 요건을 동적으로 첨가하며, 기능 확장이 필요할 때 서브크래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.
즉, 장식시켜주는 객체들과 장식 받을 객체들을 만든 뒤 이들을 이용하여 장식 받을 객체가 원하는 모양이 되도록 만들어주는 패턴이며 이때, 기존의 객체(장식 받을 객체)를 활용하고 있던 모듈은 장식이 이루어지는 것과 무관하게 작동을 해야 한다.
복잡해 보이는 설명을 풀어서 설명해보겠습니다.
문을 밀고 들어가 카운터에서 점원에게 주문을 합니다.
"따뜻한 카페라떼 한 잔 주세요"
옆에서 커피가 나오는 동안 기다리는데, 다른 손님이 들어와서 주문을 합니다.
"카라멜 프라푸치노에, 헤이즐럿 시럽 한 번이랑 자바칩 넣어주세요! 그리고 카라멜 드리즐이랑 초코 드리즐 깔아주세요"
첫 번째 주문만 있을 경우에는 데코레잍터 패턴을 굳이 사용할 이유가 없습니다. 하지만 요즘 많은 고객들은 자신의 취향에 맞게 기존에 레시피에 추가를 하거나 빼서 주문을 시킵니다.
두 번째 주문의 경우 카라멜 프라푸치노 + 헤이즐럿 시럽 + 자바칩 + 카라멜 드리즐 + 초코 드리즐 로 많은 데코레이션 재료가 추가되었습니다.
이것을 소프트웨어 적으로 바라본다면, 카라멜 프라푸치노 라는 객체에 헤이즐럿 시럽 객체, 자바칩 객체 등이 추가 되었다고 볼 수 있습니다.
[디자인 패턴] 데코레이터 패턴(Decorator Pattern) 예제
이번에는 다른 예시로 설명드리겠습니다.
Robot에 사람의 팔처럼 유연한 팔과 일반적인 Robot 팔을 붙여라 (기존 프로그램)
기존에 Robot에 사람의 팔처럼 유연한 팔과 일반적인 Robot 팔을 붙여라라는 프로젝트를 진행하였고 아래는 그 기존 소스코드입니다.
만들어진 팔을 Robot에 설치하고 작동한다.
추가 요구 사항
모든 팔(HumanArm, RobotArm)에 가제트 팔과 같은 기능을 추가하고 Robot팔은 태권V 팔의 기능을 추가해 주세요.
이와 같이 갑자기 기능 추가 및 수정사항이 발생하였을 때 적합한 Decorator Pattern을 활용하기로 했습니다.
여기서 기존에 사용하던 ArmCore와 RobotArm에 기능을 추가하게 되면 HumanArm과 RobotArm 두 팔의 본연의 기능을 사용할 수 없게된다.
본연의 기능은 수정하지 않고, 기능만 추가한다?
이때 필요한 것이 Decorator Pattern이다.
순수한 팔 기능을 가진 ArmCore class를 확장합니다. - public class ArmDecorator extends ArmCore
다른 ArmCore Instance를 멤버로 갖는다. public ArmDecorator(ArmCore armCore){ this.armCore = armCore }
Decorator class를 확장하여 새로운 기능 구현
새로운 요구사항에 따른 Robot 실행
1. 모든 팔에는 가제트 팔 기능 추가
2. Robot 팔에는 태권 V 팔 기능 추가
Decorator Pattern과 java.io 패키지
파일 읽기 기능 구현
버퍼링 기능 추가
행번호 관리 기능 추가
버퍼링 기능 제거
파일 읽기에서 Socket 통신으로 기능 변경
'IT knowledge > GoF & Architecture' 카테고리의 다른 글
DDD(Domain-Driven Design) 도메인 주도 설계란? (2) | 2023.04.07 |
---|---|
Layered Architecture (계층화 아키텍처) 란 무엇인가? (0) | 2023.03.13 |
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) 정리 및 예제 - 생성 패턴 (4) | 2021.04.14 |
[디자인 패턴] 디자인 패턴(Design Pattern) 이란? - 개념 및 분류(생성 패턴, 구조 패턴, 행동 패턴) (0) | 2021.04.13 |
[디자인 패턴] 어댑터 패턴(Adapter Pattern) 개념 정리 및 예제 - 구조 패턴 (0) | 2021.04.08 |