반응형
구조 패턴 - Decorator
해결하려는 문제
- 기존 객체 수정없이 새로운 책임을 추가하고 싶을 때
public class Main {
public static void main(String[] args) {
Beverage water = new Water();
water.printPrice();
Beverage milk = new Milk();
milk.printPrice();
Beverage espresso = new Espresso();
espresso.printPrice();
Beverage americano = new Americano(espresso, water);
americano.printPrice();
Beverage caffeLatte = new CaffeLatte(espresso, milk);
caffeLatte.printPrice();
Beverage caffeMocha = new CaffeMocha(caffeLatte, 500);
caffeMocha.printPrice();
}
}
public interface Beverage {
String getName();
int getPrice();
default void printPrice() {
Systemo.out.println(getName() + "의 가격은 " + getPrice() + "원");
}
}
public class Water implements Beverage {
@Override
public String getName() {
return "물";
}
@Override
public int getPrice() {
return 1000;
}
}
public class Milk implements Beverage {
@Override
public String getName() {
return "우유";
}
@Override
public int getPrice() {
return 1500;
}
}
public class Espresso implements Beverage {
@Override
public String getName() {
return "에스프레소";
}
@Override
public int getPrice() {
return 2000;
}
}
public class Americano implements Beverage {
private Beverage espresso;
private Beverage water;
public Americano(Beverage espresso, Beverage water) {
this.espresso = espresso;
this.water = water;
}
@Override
public String getName() {
return "아메리카노";
}
@Override
public int getPrice() {
return espresso.getPrice() + water.getPrice();
}
}
public class CaffeLatte implements Beverage {
private Beverage espresso;
private Beverage milk;
public CaffeLatte(Beverage espresso, Beverage milk) {
this.espresso = espresso;
this.milk = milk;
}
@Override
public String getName() {
return "카페라떼";
}
@Override
public int getPrice() {
return espresso.getPrice() + milk.getPrice();
}
}
public class CaffeMocha implements Beverage {
private Beverage caffeLatte;
private int syrupPrice;
public CaffeMocha(Beverage caffeLatte, int syrupPrice) {
this.caffeLatte = caffeLatte;
this.syrupPrice = syrupPrice;
}
@Override
public String getName() {
return "카페모카";
}
@Override
public int getPrice() {
return caffeLatte.getPrice() + syrupPrice;
}
}
반응형
'cs > java-spring-boot' 카테고리의 다른 글
[Zero-base] 11-9. 스트러티지(Strategy) (0) | 2022.03.15 |
---|---|
[Zero-base] 11-8. 프록시(Proxy) (0) | 2022.03.15 |
[Zero-base] 11-6. 파사드(Facade) (0) | 2022.03.15 |
[Zero-base] 11-5. 어댑터(Adaptor) (0) | 2022.03.15 |
[Zero-base] 11-4. 팩토리(Factory) (0) | 2022.03.15 |