定义:
Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比生成子类更为灵活。)
装饰者模式UML类图:
比如你想喝一杯咖啡,一杯10块钱,我们叫它原味咖啡。原味咖啡有点儿苦,你想让老板加点糖,老板说可以,不过的价钱,加一份儿糖2块钱,我们叫它加糖咖啡,这时你又想到,加点儿奶是不是更好喝一些,同样得加钱,加份儿奶3块钱,这样你就得到了一杯加糖牛奶咖啡。代码如下:
饮料抽象类:
public abstract class Beverage {
protected String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double getPrice();
}
饮料实现类-咖啡:
public class Coffee extends Beverage {
@Override
public double getPrice() {
return 10.00;
}
}
装饰者类:
public class BeverageDecorator extends Beverage {
private Beverage beverage;
public BeverageDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double getPrice() {
return beverage.getPrice();
}
}
装饰者实现类,给咖啡加糖:
public class SugarCoffee extends BeverageDecorator {
public SugarCoffee(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return super.getDescription() + ",加糖";
}
@Override
public double getPrice() {
return super.getPrice() + 2.00;
}
}
装饰者实现类,给咖啡加牛奶:
public class MilkCoffee extends BeverageDecorator {
public MilkCoffee(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return super.getDescription() + ",加牛奶";
}
@Override
public double getPrice() {
return super.getPrice() + 3.00;
}
}
客户端:
public class Client {
public static void main(String[] args) {
//创建一种叫咖啡的饮料
Beverage coffee = new Coffee();
//给咖啡加糖
coffee = new SugarCoffee(coffee);
//给咖啡加牛奶
coffee = new MilkCoffee(coffee);
System.out.println("你点的饮料是:"+coffee.getDescription()+"\n"+"价格是:"+coffee.getPrice()+"元");
}
}
当我们需要扩展一个类的功能,或者给一个类动态的附加功能,又或者想在一个方法的执行前/后添加自己的行为,都可以选择装饰者模式。