티스토리 뷰
반응형
동적으로 책임 추가가 필요할 때 데코레이터 패턴을 사용할 수 있다.
기본 설계
- Component : 실질적인 인스턴스를 컨트롤하는 역할
- ConcreteComponent : Component의 실질적인 인스턴스 부분이며, 책임의 구현 부분
- Decorator : Component와 Concrete Decorator를 동일 시 하도록 해주는 역할
- ConcnreteDecorator : 실질적인 장식 인스턴스 및 정의이며 추가된 책임의 구현 부분
실습 요구 사항
커피 제조 방법
- 에스프레소 : 커피의 기본
- 아메리카노 : 에스프레소 + 물
- 카페라떼 : 에스프레소 + 스팀밀크
- 헤이즐넛 : 아메리카노 + 헤이즐넛 시럽
- 카페모카 : 카페라떼 + 초콜릿
- 캬라멜 마끼야또 : 카페라떼 + 카라멜 시럽
- IBeverage : 커피 가격 산출
- Base : 커피 가격 산출의 실질적인 책임 부분
- AbstAdding : 추가된 어떤 것들을 가지고 있음
- Espresso : 추가 재료들을 구현
총 가격을 산출하는 프로그램을 짜보자.
소스를 통해 살펴보자.
Base
public class Base implements IBeverage {
@Override
public int getTotalPrice() {
return 0;
}
}
IBeverage
public interface IBeverage {
int getTotalPrice();
}
AbstAdding
abstract public class AbstAdding implements IBeverage {
private IBeverage base;
public AbstAdding(IBeverage base) {
super();
this.base = base;
}
@Override
public int getTotalPrice() {
return base.getTotalPrice();
}
public IBeverage getBase() {
return base;
}
public void setBase(IBeverage base) {
this.base = base;
}
}
Espresso && Milk
public class Milk extends AbstAdding {
public Milk(IBeverage meterial) {
super(meterial);
}
@Override
public int getTotalPrice() {
return super.getTotalPrice()+50;
}
}
public class Espresso extends AbstAdding {
static protected int espressoCount = 0;
public Espresso(IBeverage base) {
super(base);
}
@Override
public int getTotalPrice() {
return super.getTotalPrice()+getAddPrice();
}
private static int getAddPrice() {
espressoCount++;
int addPrice = 100;
if(espressoCount > 1) {
addPrice = 70;
}
return addPrice;
}
}
Main 및 결과
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
IBeverage beverage = new Base();
boolean done = false;
while(!done) {
System.out.println("음료 현재 가격 : " + beverage.getTotalPrice());
System.out.println("선택 : 1. 샷 추가 / 2. 우유 추가");
int inputVal = sc.nextInt();
if(inputVal == 0) {
done = true;
} else if(inputVal == 1) {
beverage = new Espresso(beverage);
} else if(inputVal == 2) {
beverage = new Milk(beverage);
}
}
System.out.println("음료 가격 : " + beverage.getTotalPrice());
sc.close();
}
//실행 결과
음료 현재 가격 : 0
선택 : 1. 샷 추가 / 2. 우유 추가
1
음료 현재 가격 : 100
선택 : 1. 샷 추가 / 2. 우유 추가
2
음료 현재 가격 : 120
선택 : 1. 샷 추가 / 2. 우유 추가
1
음료 현재 가격 : 190
선택 : 1. 샷 추가 / 2. 우유 추가
0
음료 가격 : 190
반응형
'Java > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 책임 사슬 패턴 (0) | 2020.06.07 |
---|---|
[디자인 패턴] 방문자 패턴 (0) | 2020.05.24 |
[디자인 패턴] 컴포지트 패턴 (0) | 2020.05.24 |
[디자인 패턴] 브릿지 패턴 (0) | 2020.05.18 |
[디자인 패턴] 추상 팩토리 패턴 (0) | 2020.05.18 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자바8
- 이펙티브 자바
- Effective Java
- Spring
- 정적팩터리메서드
- package-private
- try with resources
- 빈 순환 참조
- java
- jdk버전
- try catch finally
- @Lazy
- 점층적 생성 패턴
- 김영한
- mustache
- 빌더 패턴
- 연관관계
- ifPresent
- JPA
- junit
- 복사 팩토리
- springboot
- 스프링부트
- effectivejava
- 인프런
- 생성자
- java8
- 이펙티브자바
- 팩토리 메소드 패턴
- flatMap
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함