Decorator Pattern:
주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.
package pattern.decorator.starbucks;
abstract class Beverage{
String description="Unknown Drink";
public String getDescription(){
return description;
}
public abstract double cost();
}
class Espresso extends Beverage{
public Espresso(){
description="Espresso";
}
@Override
public double cost() {
return 3000;
}
}
class HouseBlend extends Beverage{
public HouseBlend(){
description="House Blend";
}
@Override
public double cost() {
return 3500;
}
}
class DarkRost extends Beverage{
public DarkRost(){
description="DarkRost";
}
@Override
public double cost() {
return 3500;
}
}
class Decaf extends Beverage{
public Decaf(){
description="Decaf";
}
@Override
public double cost() {
return 4000;
}
}
abstract class CondimentDecorator extends Beverage{
Beverage beverage;
@Override
public abstract String getDescription();
}
class Milk extends CondimentDecorator{
public Milk(Beverage beverage){
this.beverage=beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+", Milk";
}
@Override
public double cost() {
return 3000+beverage.cost();
}
}
class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
class Soy extends CondimentDecorator {
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
public double cost() {
return .15 + beverage.cost();
}
}
class Whip extends CondimentDecorator {
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
public double cost() {
return .10 + beverage.cost();
}
}
public class Main {
public static void main(String[] args) {
Beverage beverage=new Espresso();
System.out.println(beverage.getDescription()+"\\"+beverage.cost());
Beverage beverage2 = new DarkRost();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()
+ " $" + beverage2.cost());
}
}
package pattern.decorator.pizza;
import java.text.DecimalFormat;
abstract class Pizza {
String description = "Basic Pizza";
public String getDescription() {
return description;
}
public abstract double cost();
}
//두꺼운피자
class ThickcrustPizza extends Pizza {
public ThickcrustPizza() {
description = "Thick crust pizza, with tomato sauce";
}
public double cost() {
return 7.99;
}
}
//얇은피자
class ThincrustPizza extends Pizza {
public ThincrustPizza() {
description = "Thin crust pizza, with tomato sauce";
}
public double cost() {
return 7.99;
}
}
//토핑 데코레이터
abstract class ToppingDecorator extends Pizza {
Pizza pizza;
public abstract String getDescription();
}
class Cheese extends ToppingDecorator {
public Cheese(Pizza pizza) {
this.pizza = pizza;
}
public String getDescription() {
return pizza.getDescription() + ", Cheese";
}
public double cost() {
return pizza.cost(); // cheese is free
}
}
class Olives extends ToppingDecorator {
public Olives(Pizza pizza) {
this.pizza = pizza;
}
public String getDescription() {
return pizza.getDescription() + ", Olives";
}
public double cost() {
return pizza.cost() + 0.3;
}
}
public class Main {
public static void main(String[] args) {
Pizza pizza = new ThincrustPizza();
Pizza cheesePizza = new Cheese(pizza);
Pizza greekPizza = new Olives(cheesePizza);
DecimalFormat decimal = new DecimalFormat("#.###");
System.out.println(greekPizza.getDescription()
+ " $" + decimal.format(greekPizza.cost()));
}
}
옵저버 패턴에 비해 이해하기 쉬웠고 구현하는것도 수월했다.
'Java' 카테고리의 다른 글
[Java]_JAVA로 디자인패턴 공부_Factory method Pattern (0) | 2021.07.15 |
---|---|
[Java]_JAVA로 디자인패턴 공부_Observer Pattern (0) | 2021.07.14 |
[Java]_JAVA로 디자인패턴 공부_Strategy Pattern (0) | 2021.07.14 |
[Java]_JAVA로 디자인패턴 공부 (0) | 2021.07.14 |
[Java]_#1 (0) | 2021.07.05 |