动态地给一个对象添加一些额外的职责,即增加其额外的功能。
package com.strife.pattern.decorator;
/**
* 装饰器模式
*
* @author mengzhenghao
* @date 2022/5/29
*/
public class Decorator {
public static void main(String[] args) {
AbstractDrink drink = new LongBlackCoffee();
System.out.println(drink.getDesc() + " 价格:" + drink.cost());
//加牛奶
drink = new Milk(drink);
System.out.println(drink.getDesc() + " 价格:" + drink.cost());
//加糖
drink = new Sugar(drink);
System.out.println(drink.getDesc() + " 价格:" + drink.cost());
}
}
/** 抽象主体 */
abstract class AbstractDrink {
protected String desc;
private float price = 0.0f;
/** 计算费用的抽象方法 */
abstract float cost();
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
/** 主体 */
class Coffee extends AbstractDrink {
@Override
float cost() {
return super.getPrice();
}
}
/** 意大利咖啡 */
class EspressoCoffee extends Coffee {
public EspressoCoffee() {
setDesc("意大利咖啡");
setPrice(6.0f);
}
}
/** 美式咖啡 */
class LongBlackCoffee extends Coffee {
public LongBlackCoffee() {
setDesc("美式咖啡 && 5.0");
setPrice(5.0f);
}
}
class ShortBlackCoffee extends Coffee {
public ShortBlackCoffee() {
setDesc("short black");
setPrice(5.0f);
}
}
/** 装饰者 */
class CoffeeDecorator extends AbstractDrink {
private AbstractDrink drink;
public CoffeeDecorator(AbstractDrink drink) {
this.drink = drink;
}
@Override
float cost() {
return super.getPrice() + drink.cost();
}
@Override
public String getDesc() {
return drink.getDesc() + desc + " && " + super.getPrice();
}
}
/** 具体的装饰者 */
class Milk extends CoffeeDecorator {
public Milk(AbstractDrink drink) {
super(drink);
setDesc(" 加牛奶");
setPrice(2.0f);
}
}
/** 具体的装饰者 */
class Sugar extends CoffeeDecorator {
public Sugar(AbstractDrink drink) {
super(drink);
setDesc(" 加糖");
setPrice(1.0f);
}
}