본문 바로가기

Java

[Java]_JAVA로 디자인패턴 공부_Decorator Patter

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()));
}
}

 


옵저버 패턴에 비해 이해하기 쉬웠고 구현하는것도 수월했다.