`
dwlovehcy
  • 浏览: 32942 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式之三----装饰模式

 
阅读更多

java io中广泛应用到了装饰者模式

装饰者和被装饰对象有相同的超类型

你可以使用一个或多个装饰者包装一个对象

既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装)的场合,可以用装饰过的对象代替它。

(关键点)装饰者可以在委托被装饰者的行为之前与/或之后,加上自己的行为,已达到特定的目的

对象可以在任何时候被装饰,所以可以在运行时动态的、不限量的使用你喜欢的装饰者来装饰对象

 

 

 

1 基类--饮料(抽象类)   描述和价格

package com.pattern;
/**
 * 
 * @author shasha
 * 饮料类
 */
public abstract class Beverage {

	String description ="unknown beverage";
	
	public String getDescription(){
		return description;
	}
	
	public abstract double cost();
}

 

 

2 装饰基类---调料  重写描述是为了在装饰的时候灵活加上描述

 

package com.pattern;
/***
 * 
 * @author duwan
 * 调料(装饰者基类)
 */
public abstract class CondimentDecorator extends Beverage{

	@Override
	//重写描述方法
	public abstract String getDescription();
	
}

  

3 两个饮料类 和 它们的三个装饰者

 

package com.pattern;
/***
 * 
 * @author shasha
 * 浓咖啡
 */
public class Espresso extends Beverage {

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

	public Espresso(){
		description="Espressso";
	}
}


package com.pattern;

public class HouseBlend extends Beverage {

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

	public HouseBlend(){
		description="HouseBlend Coffee";
	}
	
}


package com.pattern;

/***
 * 
 * @author shasha
 * 牛奶--调料装饰者
 */
public class Milk extends CondimentDecorator{

	//被装饰者
	Beverage beverage;
	public Milk(Beverage beverage){
		this.beverage=beverage;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return beverage.description+", Milk";
	}

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

}



package com.pattern;
/**
 * 
 * @author shasha
 * 摩卡是一个装饰者
 */
public class Mocha extends CondimentDecorator{

	Beverage beverage;
	
	public Mocha(Beverage beverage){
		this.beverage=beverage;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return beverage.getDescription()+",Mocha";
	}

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

}


package com.pattern;
/***
 * 
 * @author shasha
 * 大豆是一种调料装饰者
 */
public class Soy extends CondimentDecorator {

	Beverage beverage;
	
	public Soy(Beverage beverage){
		this.beverage=beverage;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return beverage.getDescription()+",Soy";
	}

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

}

 

 

4 开始装饰模式的测试

package com.pattern;
/**
 * 
 * @author shasha
 * 咖啡厅 来测试
 */
public class StarbuzzCoffee {

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics