2015년 6월 24일 수요일

클래스 디자인 패턴 3. Decoration Pattern_

1. 개념
  1) 정의 : 객체에 추가적인 요건을 동적으로 추가한다.
       본체가 될 수 있는 내용들은 그대로 상속,
       추가되는 내용들을 묶어서 데코레이션 이라는 추상화 객체
       밑에 둔다. 그리고 데코레이션 밑의 생성자를 작성시
       (기존 객체 내용 + 추가사항을 추가)
       객체 정보를 유지하고 덮어쓰기 가능토록 하여
       생성할때 기존 객체 내용이 유지되도록 작성한다.
       결과적으로 같이 상속 받는 클래스이지만 원본 클래스와
       장식 클래스가 하는일이 구별되게 구현된다.

  2) 상속으로 표현하기에 까다로운(옵션처럼 넣어도 되고
       안넣어도 되는) 내용을 관리하는데 용이하다.
      안좋은 점은 클래스가 늘어나고(조금)
       가독성도 안좋아지고 안좋아지고 안좋아지고....
       머리는 복잡해지고 복잡해지고 물론 아래 예제는
       정말 간단한 경우고 






2. 구현
  1) 프로젝트 구성
















  2) 코드
   (1) Beverage (주문 추상화 클래스)

package beverageBase;

public abstract class Beverage {
 protected String description = "no Title";
 
 public String getDescription(){
  return description;
 }
 
 public abstract double cost();

}

   (2) Test 를 위한 main 포함 커피숍 클래스

package coffeeSale;

import decorations.Mocha;
import decorations.Soy;
import decorations.Whip;
import products.DarkRoast;
import products.Espresso;
import products.HouseBlend;
import beverageBase.Beverage;

public class StarbuzzCoffee {
 public static void main(String args[]){
  Beverage beverage = new Espresso();
  
  System.out.println(beverage.getDescription()+"$" + beverage.cost());
  
  Beverage beverage2 = new DarkRoast();
  beverage2 = new Mocha(beverage2);
  beverage2 = new Mocha(beverage2);
  beverage2 = new Mocha(beverage2);
  beverage2 = new Whip(beverage2);
  System.out.println(beverage2.getDescription()+"$" + beverage2.cost());
  
  Beverage beverage3 = new HouseBlend();
  beverage3 = new Soy(beverage3);
  beverage3 = new Mocha(beverage3);
  beverage3 = new Whip(beverage3);
  System.out.println(beverage3.getDescription()+"$" + beverage3.cost());
 }
}

   (3) Decoration 관리를 위한 추상 CondimentDecorator

package decorationA;

import beverageBase.Beverage;

public abstract class CondimentDecorator extends Beverage{
 public abstract String getDescription();
}

   (4) Decoration 클래스 Milk

package decorations;

import beverageBase.Beverage;
import decorationA.CondimentDecorator;

public class Milk extends CondimentDecorator{
 Beverage beverage;
 
 public Milk(Beverage beverage) {
  this.beverage = beverage;
 }

 @Override
 public String getDescription() {
  
  return beverage.getDescription()+", Milk";
 }

 @Override
 public double cost() {
  // TODO Auto-generated method stub
  return .10+beverage.cost();
 }
}

* 원하는 숫자만큼 작성
   (5) 제품 클래스  DarkRoast
package products;

import beverageBase.Beverage;

public class DarkRoast extends Beverage {
 public DarkRoast(){
  
  description = "DarkRoast";
  
 }

 @Override
 public double cost() {
  // TODO Auto-generated method stub
  return .99;
 }
}


* 원하는 숫자만큼 작성

ps. 데코레이션 패턴 관련 링크 
프리젠테이션으로 잘 정리함 적절하게 제가 적절하게 설명하지
   못한 부분때문에 머리 싸매지 마시고 
   아래 링크를 한번 들어가시기 바랍니다.
https://prezi.com/femqnxnjgsoi/decoration-pattern/

댓글 없음:

댓글 쓰기