装饰器模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
父类饮料类
package com.TWO;
//店内所提供的饮料都必须继承自此类
public abstract class Beverage {
String description = "unknown Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
抽象调料类
package com.TWO;
//调料抽象类
public abstract class CondimentDecorator extends Beverage{
//所有的调料装饰者都必须重新实现getDescription方法
public abstract String getDescription();
}
3.一种叫Espresso的饮料
package com.TWO;
//Espresso扩展自Beverage类。是一种饮料
public class Espresso extends Beverage{
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
一种叫HouseBlend的饮料
package com.TWO;
//这是另一种饮料
public class HouseBlend extends Beverage{
public HouseBlend(){
description = "house blend coffee";
}
@Override
public double cost() {
return 0.89;
}
}
具体的调料类
package com.TWO;
public class Mocha extends CondimentDecorator{
//将饮料组合进来
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 com.TWO;
public class StarbuzzCoffee {
public static void main(String args[]){
Beverage beverage = new Espresso();
System.out.println("原味的Espresso饮料的价格是"+ beverage.cost());
Beverage beverage1 = new Mocha(beverage);
System.out.println("原味的Espresso饮料加上1mocha的价格" + beverage1.cost());
Beverage beverage2 = new Mocha(beverage1);
System.out.println("原味的Espresso饮料加上2mocha的价格" + beverage2.cost());
}
}
jdk中利用装饰器模式实现的类
java i/o