7. 데코레이터 패턴 (Decorator)
객체에 껍질을 씌우듯 동적으로 기능을 추가하는 데코레이터 패턴을 알아봅니다.
커피를 주문할 때 기본 커피에 샷을 추가하고, 거기에 우유를 추가하고, 휘핑크림까지 올리면 새로운 커피가 되죠? 기존 코드를 수정하지 않고 객체를 감싸서 새로운 기능을 덧붙이는 방식을 데코레이터 패턴이라고 해요.
(참고: 모든 커피가 가져야 할 기본 성질이에요)
[커피]를 규정하자:
[숫자]를 돌려주는 <가격>이 있어야 한다 ()
[문자열]을 돌려주는 <설명>이 있어야 한다 ()
(참고: 베이스가 되는 기본 커피예요)
[커피]를 따르는 [기본커피]를 설계하자:
[숫자]를 돌려주는 <가격>을 만들자 ():
3000을 돌려주자
[문자열]을 돌려주는 <설명>을 만들자 ():
"에스프레소"를 돌려주자
(참고: 커피를 감싸서 우유를 추가하는 데코레이터예요)
[커피]를 따르는 [우유추가]를 설계하자:
'원본커피'를 [커피]인 비어있음으로 정하여 숨기자
처음 만들어질 때 ([커피]인 '커피') 다음과 같이 하자:
'나'의 '원본커피'를 '커피'로 정하자
[숫자]를 돌려주는 <가격>을 만들자 ():
'나'의 '원본커피'의 <가격>() + 500을 돌려주자
[문자열]을 돌려주는 <설명>을 만들자 ():
틀"{'나'의 '원본커피'의 <설명>()} + 우유"를 돌려주자
(참고: 기본 커피를 먼저 만들고)
'내커피'를 [커피]인 새로운 [기본커피]()로 정하자
(참고: 우유로 껍질을 씌워줍니다!)
'라떼'를 [커피]인 새로운 [우유추가]('내커피')로 정하자
틀"메뉴: {'라떼'의 <설명>()}"를 출력하자
틀"가격: {'라떼'의 <가격>()}원"을 출력하자