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