데코레이터 패턴을 활용한 커피 머신 프로그램
Decorator Pattern
- 자바의 입출력 스트림은 decorator pattern 임
- 여러 decorator들을 활용하여 다양한 기능을 제공
- 상속보다 유연한 구현 방식
- 데코레이터는 다른 데코레이터나 또는 컴포넌트를 포함해야 함
- 지속적인 기능의 추가와 제거가 용이함
- component와 decorator는 동일한 것이 아님
- ( 기반 스트림 클래스가 직접 읽고 쓸 수 있음, 보조 스트림은 추가적인 기능 제공 )
예제) 커피를 만들어보아요~
Decorator Pattern을 활용하여 커피를 만들어 봅시다.
커피( 에티오피아 아메리카노 )
카페 라떼 = 아메리카노 + 우유
모카 커피 = 아메리카노 + 우유 + 모카시럽
커피는 컴포넌트고, 우유, 모카시럽, whipping cream은 모두 데코레이터임
-최상위 추상 클래스 Coffee
-Coffee를 상속받은 Component 에티오피아 아메리카노
-Coffee에 있는 애들에 다가 추가 기능 위한 데코레이터 클래스 생성
-데코레이터들 종목들 (우유 / 모카 시럽 ) 추가
추상 클래스 Coffee
- Cooffee 클래스를 상속받은 EtiopiaAmericano
-Coffee 클래스 상속받은 - Component 에티오피아 아메리카노
- 데코레이터 클래스 생성
- 데코레이터 항목 추가
- Latte 추가
- Mocha 추가
- 출력 테스트
모카 만들기에서 위에서 라떼까지 만들어 놓은 etiopiaLatte 써도 괜찮다.!
커피에 기본인 에티오피아 아메리카노 만들어서 출력 확인
( 아메리카노 + 우유 추가)한 라떼 출력 확인
( 라떼에 + 모카 추가)한 모카 에티오피아 출력 확인
+ 기본이 되는 아메리카노를 추가하고 싶다.
+ 컴포넌트 추가하고 싶다. extends Coffee ( Etiopia / Keya )
+ 데코 항목 추가하고 싶다.
+ 휘핑크림 추가 - extends Decorator
-케냐 커피 출력 테스트
케냐 커피 = 케냐 아메리카노 + 우유 + 모카 시럽 + 휘핑크림
이렇게 여러 가지 기능들을 데코레이터 패턴으로 추가할 수 있다
실제 컴포넌트는 맨 뒤에 애들이다. ( EtiopiaAmericano()와 KeyaAmericano() )
유의해야 될 점
abstract Decorator 클래스를 어떻게 만들지 와
생성자에 Coffee coffee 하나 포함해야 된다는 점
review
자바의 입출력에서 사용하는 Decorator Pattern에 대해 학습하였다.
기존 클래스를 상속 받아서 거기에 추가 기능을 더해주는 것보다 훨씬 유연한 방식으로
기능이 추가되거나 종목이 추가되어도 쉽게 적용해서 사용할 수 있는 방식이었다.
Coffee머신 예제를 해보았는데
최상위 클래스 Coffee를 상속받아서 ComponentClass를 만들어 주고
여기에 여러가지 기능을 추가하기 위해
Coffee 클래스를 상속받아 - 상속전용 abstract Decorator 클래스를 만들고
Decorator 클래스를 상속받아서 추가해줄 기능 클래스들을 만들어 주면 된다.
종목을 추가해주고 싶으면 Coffee 클래스를 상속받아서 ComponentClass를 추가해주면 끝!
기능을 추가해주고 싶으면 Decorator 클래스를 상속받아 구현해주면 끝!
데코레이터 사용시 다른 데코레이터를 감싸주거나 컴포넌트를 포함해야 된다는 점 주의
사용법과 원리가 간단하고 유연함을 느꼈다.
다만 abstract Decorato 클래스를 잘 구현하지 못한다면 효율성이 많이 떨어질 것이라는 생각도 든다.
어떻게 구현할것인가 생각하는 게 중요하다는 것을 느꼈고,
데코레이터 클래스에 생성자를 생성하는 것과재정의 해주는 부분 check해 놓아야 할 것 같다.
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter6' 카테고리의 다른 글
Thread 클래스의 여러 메서드들 (0) | 2022.02.02 |
---|---|
자바에서 Thread 만들기 (0) | 2022.01.28 |
직렬화 (serialization) (0) | 2022.01.25 |
여러가지 보조 스트림 클래스들( InputStreamReader, BufferedInputStream, DataInputStream ) (0) | 2022.01.24 |
문자 단위 입출력 스트림 ( Reader , Writer ) (0) | 2022.01.24 |