노트의 장식자 모드 배우기

3577 단어 장식자 모드
자세히 보기
장식자(Decorator) 모드는 포장(Wrapper) 모드라고도 부르며 대상에 동적 책임을 부가한다.기능을 확장하려면, 장식자가 계승보다 더 탄력적인 대체 방안을 제공한다.

package org.kangsg219.abst;

// 
public abstract class Beverage {
	
	public String description="Unknown Beverage!";
	
	public String getDescription(){
		return description;
	}
	
	public abstract double cost();

}


package org.kangsg219.abst;

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

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;

// (Espresso) 
public class Espresso extends Beverage {

	public Espresso(){
		description="Espresso";
	}
	
	@Override
	public double cost() {
		
		return 1.99;
	}

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;
//HouseBlend 
public class HouseBlend extends Beverage {

	public HouseBlend(){
		description="HouseBlend";
	}
	
	@Override
	public double cost() {
		
		return 0.89;
	}

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;
import org.kangsg219.abst.CondimentDecorator;

public class Mocha extends CondimentDecorator {

	public Beverage beverage;
	
	public Mocha(Beverage beverage){
		this.beverage=beverage;
	}
	
	@Override
	public String getDescription() {
		
		return beverage.getDescription()+",mocha";
	}

	@Override
	public double cost() {
		
		return beverage.cost()+0.20;
	}

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;
import org.kangsg219.abst.CondimentDecorator;

// 
public class Whip extends CondimentDecorator {

	public Beverage beverage;
	
	public Whip(Beverage beverage){
		this.beverage=beverage;
	}
	
	@Override
	public String getDescription() {
		
		return beverage.getDescription()+",Whip";
	}

	@Override
	public double cost() {
		
		return beverage.cost()+ 0.10;
	}

}


package org.kangsg219.test;

import org.kangsg219.abst.Beverage;
import org.kangsg219.impl.Espresso;
import org.kangsg219.impl.HouseBlend;
import org.kangsg219.impl.Mocha;
import org.kangsg219.impl.Whip;

public class StarbuzzCoffee {

	
	public static void main(String[] args) {
		// , 。
		Beverage beverage=new Espresso();
		System.out.println(beverage.getDescription()+" $"+beverage.cost());
		
		// HouseBlend 
		Beverage beverage2=new HouseBlend();
		beverage2=new Mocha(beverage2);
		beverage2=new Mocha(beverage2);
		beverage2=new Whip(beverage2);
		System.out.println(beverage2.getDescription()+" $"+beverage2.cost());		
	}

}


실행 결과:
Espresso $1.99
HouseBlend,mocha,mocha,Whip $1.39

좋은 웹페이지 즐겨찾기