Decorator Pattern

This commit is contained in:
kim
2021-01-15 15:40:18 +09:00
parent 3ca5b69ce9
commit aa329c4f95
7 changed files with 120 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
Decorator Pattern
- 동적으로 책임 추가
예제 - 커피 제조 방법
- 에스프레소 : 커피의 기본
- 아메리카노 : 에스프레소 + 물
- 카페라떼 : 에스프레소 + 스팀밀크
- 헤이즐넛 : 아메리카노 + 헤이즐넛 시럽
- 카페모카 : 카페라떼 + 초콜릿
- 캬라멜 마끼아또 : 카페라떼 + 캬라멜 시럽

View File

@@ -0,0 +1,28 @@
package Decorator;
import Decorator.abst.IBeverage;
import Decorator.concrete.Base;
import Decorator.concrete.Espresso;
import Decorator.concrete.Milk;
import java.util.Scanner;
public class 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. 우유 추가");
switch (sc.nextInt()) {
case 0: done = true; break;
case 1: beverage = new Espresso(beverage); break;
case 2: beverage = new Milk(beverage); break;
}
}
System.out.println("음료 가격 : " + beverage.getTotalPrice());
sc.close();
}
}

View File

@@ -0,0 +1,19 @@
package Decorator.abst;
abstract public class AbstAdding implements IBeverage{
private IBeverage base;
public AbstAdding(IBeverage base) {
this.base = base;
}
@Override
public int getTotalPrice() {
return base.getTotalPrice();
}
protected IBeverage getBase() {
return base;
}
}

View File

@@ -0,0 +1,6 @@
package Decorator.abst;
public interface IBeverage {
int getTotalPrice();
}

View File

@@ -0,0 +1,10 @@
package Decorator.concrete;
import Decorator.abst.IBeverage;
public class Base implements IBeverage {
@Override
public int getTotalPrice() {
return 0;
}
}

View File

@@ -0,0 +1,27 @@
package Decorator.concrete;
import Decorator.abst.AbstAdding;
import Decorator.abst.IBeverage;
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 += 1;
int addPrice = 100;
if (espressoCount > 1) {
addPrice = 70;
}
return addPrice;
}
}

View File

@@ -0,0 +1,16 @@
package Decorator.concrete;
import Decorator.abst.AbstAdding;
import Decorator.abst.IBeverage;
public class Milk extends AbstAdding {
public Milk(IBeverage base) {
super(base);
}
@Override
public int getTotalPrice() {
return super.getTotalPrice() + 50;
}
}