Decorator Pattern
This commit is contained in:
14
design-pattern/src/Decorator/Decorator
Normal file
14
design-pattern/src/Decorator/Decorator
Normal file
@@ -0,0 +1,14 @@
|
||||
Decorator Pattern
|
||||
- 동적으로 책임 추가
|
||||
|
||||
|
||||
예제 - 커피 제조 방법
|
||||
|
||||
- 에스프레소 : 커피의 기본
|
||||
- 아메리카노 : 에스프레소 + 물
|
||||
- 카페라떼 : 에스프레소 + 스팀밀크
|
||||
- 헤이즐넛 : 아메리카노 + 헤이즐넛 시럽
|
||||
- 카페모카 : 카페라떼 + 초콜릿
|
||||
- 캬라멜 마끼아또 : 카페라떼 + 캬라멜 시럽
|
||||
|
||||
|
||||
28
design-pattern/src/Decorator/Main.java
Normal file
28
design-pattern/src/Decorator/Main.java
Normal 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();
|
||||
}
|
||||
}
|
||||
19
design-pattern/src/Decorator/abst/AbstAdding.java
Normal file
19
design-pattern/src/Decorator/abst/AbstAdding.java
Normal 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;
|
||||
}
|
||||
}
|
||||
6
design-pattern/src/Decorator/abst/IBeverage.java
Normal file
6
design-pattern/src/Decorator/abst/IBeverage.java
Normal file
@@ -0,0 +1,6 @@
|
||||
package Decorator.abst;
|
||||
|
||||
public interface IBeverage {
|
||||
|
||||
int getTotalPrice();
|
||||
}
|
||||
10
design-pattern/src/Decorator/concrete/Base.java
Normal file
10
design-pattern/src/Decorator/concrete/Base.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package Decorator.concrete;
|
||||
|
||||
import Decorator.abst.IBeverage;
|
||||
|
||||
public class Base implements IBeverage {
|
||||
@Override
|
||||
public int getTotalPrice() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
27
design-pattern/src/Decorator/concrete/Espresso.java
Normal file
27
design-pattern/src/Decorator/concrete/Espresso.java
Normal 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;
|
||||
}
|
||||
}
|
||||
16
design-pattern/src/Decorator/concrete/Milk.java
Normal file
16
design-pattern/src/Decorator/concrete/Milk.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user