Component是一个抽象类,它可以被继承实例化为一个全新的被装饰者,
也可以被继承实例化为一个用来装饰的基础组件,即装饰者。
装饰者和被装饰都继承自Component,有着有相同的方法,因为装饰者必须能取代被装饰者。
将装饰者与组件组合,就是加入新的行为。
通常装饰者模式时采用抽象类,但是在Java中可以使用接口,即将Component设计为接口。不过,如果Component原本就是抽象类,就不需要修改。
例如
星巴克中的饮料
饮料是一个对象,它需要被实例化为浓缩或深焙,然后被摩卡、奶泡等对象装饰。
在这里,饮料是Component,浓缩或深焙是被装饰者,摩卡和奶泡是装饰者。
public abstract class Beverage{
String description = "Unknown Beverage";
public String getDescription(){
return description ;
}
public abstract double cost();
}
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
public class Mocha extends CondimentDecorate{
Beverage beverage;
public Moca(Beverage beverage) {
this.beverage = beverage;
}
public String getDesp() {
// TODO Auto-generated method stub
return beverage.getDesp()+",Mocha";
}
public double cost() {
// TODO Auto-generated method stub
return .20+beverage.cost();
}
}
public class Main {
public static void main(String[] args) {
Beverage beverage = new Espresso();
beverage = new Moca(beverage);
System.out.println(beverage.getDesp()+" $"+beverage.cost());
}
}