常用设计模式——装饰模式

2020-04-13 18:53:25 浏览数 (1)

装饰者模式

概念

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更有弹性的方案

  • 装饰者与被装饰者有相同的超类型。
  • 你可以用一个或者多个装饰者包装一个对象
  • 既然装饰者与被装饰者有相同的超类型,所以可以使用装饰过的对象替换他。
  • 装饰者可以在被装饰者的行为之前/之后,加上自己的行为,已达到特定的目的
  • 对象可以在运行时被装饰

缺点

容易引入大量小类

示例

代码语言:javascript复制
/**
 * 饮料
 * @author huangy on 2019-05-19
 */
public abstract class Beverage {

    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}
代码语言:javascript复制
/**
 * 调料(装饰者抽象类)
 * @author huangy on 2019-05-19
 */
public abstract class CondimentDecorator extends Beverage {

    public abstract String getDescription();
    
}
代码语言:javascript复制
/**
 * 浓缩咖啡
 * @author huangy on 2019-05-19
 */
public class Espresso extends Beverage {

    public Espresso() {
        description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}
代码语言:javascript复制
/**
 * @author huangy on 2019-05-19
 */
public class Mocha extends CondimentDecorator {

    Beverage beverage;

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

    @Override
    public String getDescription() {
        return beverage.getDescription()   ", Mocha";
    }

    @Override
    public double cost() {
        return 0.20   beverage.cost();
    }
}
代码语言:javascript复制
public class StarbuzzCoffee {

    public static void main(String[] args) {
        Beverage beverage = new Espresso();

        Mocha mocha = new Mocha(beverage);

        System.out.println(mocha.getDescription());

        System.out.println(mocha.cost());
    }

}

0 人点赞