文章目录
10、装饰者模式
装饰者模式:动态的将新功能附加到对象上。体现了开闭原则。
应用场景:咖啡店里有深焙咖啡、浓缩咖啡。咖啡可以加的调料有巧克力调料、奶泡调料。装饰者类图如下:
代码:
public abstract class Coffee {
protected String description;
protected Integer price;
public abstract String getDescription();
public abstract Integer cost();
public void setDescription(String description) {
this.description = description;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
//深焙咖啡
public class DarkRoast extends Coffee {
public DarkRoast(){
setPrice(3);
setDescription("深焙咖啡");
}
@Override
public String getDescription() {
return description;
}
@Override
public Integer cost() {
return price;
}
}
//浓缩咖啡
public class Espresso extends Coffee{
public Espresso(){
setPrice(5);
setDescription("浓缩咖啡");
}
@Override
public String getDescription() {
return description;
}
@Override
public Integer cost() {
return getPrice();
}
}
//调料抽象类
public abstract class Decorator extends Coffee{
protected Coffee coffee;
}
//奶泡调料
public class Whip extends Decorator {
public Whip(Coffee coffee){
this.coffee = coffee;
setPrice(1);
}
@Override
public String getDescription() {
return coffee.getDescription()+",奶泡调料";
}
@Override
public Integer cost() {
return coffee.cost()+getPrice();
}
}
//巧克力调料
public class Chocolate extends Decorator {
public Chocolate(Coffee coffee){
this.coffee = coffee;
setPrice(2);
}
@Override
public String getDescription() {
return coffee.getDescription()+",巧克力调料";
}
@Override
public Integer cost() {
return coffee.cost()+getPrice();
}
}
//测试
public class Test42 {
public static void main(String[] args) {
Coffee order = new DarkRoast();
order = new Whip(order);
order = new Chocolate(order);
System.out.println(order.getDescription()+" 共"+order.cost()+"元");
}
}