参考java设计模式
装饰者模式 动态的将责任附加到对象上,若要扩展功能,装饰者提供比继承更有弹性的代替方案
类图:
举例:一杯茶,有绿茶、红茶、通过装饰者模式变成蜂蜜绿茶,加糖绿茶
上代码:
package Decorator;
/**
* 茶的抽象类
*/
public abstract class AbstractTea {
protected String description = "unkown Tea";
public String getDescription(){
return description;
}
public abstract double cost();
}
package Decorator;
/**
* 红茶
*/
public class BlackTea extends AbstractTea{
public BlackTea() {
this.description = "红茶";
}
@Override
public double cost() {
return 5;
}
}
package Decorator;
/**
* 绿茶
*/
public class GreenTea extends AbstractTea{
public GreenTea() {
this.description = "绿茶";
}
@Override
public double cost() {
return 3;
}
}
茶的装饰者: 可以做成蜂蜜绿茶 白糖绿茶
package Decorator;
public abstract class TeaDecoraotr extends AbstractTea {
public abstract String getDescription();
}
package Decorator;
/**
* 加蜂蜜的茶
*/
class AddHoneyTeaDecorator extends TeaDecoraotr {
AbstractTea abstractTea;
public AddHoneyTeaDecorator(AbstractTea abstractTea){
this.abstractTea = abstractTea;
}
@Override
public String getDescription() {
return abstractTea.getDescription() + " 加蜂蜜";
}
@Override
public double cost() {
return abstractTea.cost() + 2;
}
}
package Decorator;
/**
* 加糖的茶
*/
public class AddSugerTeaDecorator extends TeaDecoraotr {
AbstractTea abstractTea;
public AddSugerTeaDecorator(AbstractTea abstractTea){
this.abstractTea = abstractTea;
}
@Override
public String getDescription() {
return abstractTea.getDescription() + " 加糖";
}
@Override
public double cost() {
return abstractTea.cost() + 0.3;
}
}
package Decorator;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
public class DecoratorTest {
public static void main(String[] args) {
AbstractTea blackTea = new BlackTea();
System.out.println("一杯 "+blackTea.getDescription()+" 共计"+blackTea.cost()+"元");
AbstractTea greeTea = new GreenTea();
System.out.println("一杯 "+greeTea.getDescription()+" 共计"+greeTea.cost()+"元");
AbstractTea addHoneyGreenTea = new AddHoneyTeaDecorator(greeTea);
System.out.println("一杯 "+addHoneyGreenTea.getDescription()+" 共计"+addHoneyGreenTea.cost()+"元");
AbstractTea addSuggrGreenTea = new AddSugerTeaDecorator(greeTea);
System.out.println("一杯 "+addSuggrGreenTea.getDescription()+" 共计"+addSuggrGreenTea.cost()+"元");
}
}
输出:
一杯 红茶 共计5.0元 一杯 绿茶 共计3.0元 一杯 绿茶 加蜂蜜 共计5.0元 一杯 绿茶 加糖 共计3.3元