HeadFirst设计模式---装饰者

定义装饰者模式

装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。这句话摘自书中,给人读得很生硬难懂。通俗地来说,装饰者和被装饰者有相同的父类,装饰者的行为组装着被装饰者的行为。

设计星巴克咖啡

代码实现

/**
 * @author Lollipop
 * @since 2019/11/26
 */
public abstract class Beverage {
    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();

}
/**
 * @author Lollipop
 * @since 2019/11/26
 */
public abstract class CondimentDecorator extends Beverage {
    /**
     * 描述
     * @return
     */
 @Override
 public abstract String getDescription();
}
/**
 * @author Lollipop
 * @since 2019/11/26
 */
public class Mocha extends CondimentDecorator {
    private Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    /**
     * 描述
     *
     * @return
     */
    @Override
    public String getDescription() {
        return "Mocha," + this.beverage.getDescription();
    }

    @Override
    public double cost() {
        return 0.20 + this.beverage.cost();
    }
}
/**
 * @author Lollipop
 * @since 2019/11/26
 */
public class Whip extends CondimentDecorator {
    private Beverage beverage;

    public Whip(Beverage beverage) {
        this.beverage = beverage;
    }

    /**
     * 描述
     *
     * @return
     */
    @Override
    public String getDescription() {
        return "Whip," + this.beverage.getDescription();
    }

    @Override
    public double cost() {
        return 0.10 + this.beverage.cost();
    }
}

代码运行

/**
 * @author Lollipop
 * @since 2019/11/26
 */
public class StarbuzzCoffee {
    public static void main(String[] args) {
        Beverage beverage = new Espress();
        beverage = new Mocha(beverage);
        beverage = new Mocha(beverage);
        beverage = new Whip(beverage);
        System.out.println(beverage.getDescription() + " $" + beverage.cost());
    }
}

运行结果

Whip,Mocha,Mocha,Unknown Beverage $1.59

总结

  1. 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
  2. 多重嵌套,导致代码复杂度高
原文地址:https://www.cnblogs.com/Lollipop_Hsu/p/11946268.html