第 11 章 装饰者模式

资料来源于 哔哩哔哩 黑马教程 Java 设计模式

装饰者模式:继承一个一个抽象类,并持有该类对象!

11.1 概述

【快餐店的例子】

快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。

第 11 章 装饰者模式

使用继承的方式存在的问题:

  • 扩展性不好:如果要再加一种配料(火腿肠),就会发现需要给 FriedRice 和 FriedNoodles 分别定义一个子类。如果要新增一个快餐品类(炒河粉)的话,就需要定义更多的子类。
  • 产生过多的子类

定义指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

11.2 结构

装饰(Decorator)模式中的角色:

  • 抽象构件(Component)角色 :定义一个抽象接口以规范准备接收附加责任的对象。
  • 具体构件(Concrete Component)角色 :实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰(Decorator)角色 : 继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 具体装饰(ConcreteDecorator)角色 :实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

11.3 案列

使用装饰者模式对快餐店案例进行改进,体会装饰者模式的精髓。

11.3.1 类图如下

第 11 章 装饰者模式

11.3.2 代码如下

1)快餐接口-抽象构建角色

public abstract class FastFood {
    private float price;
    private String desc;

    public FastFood() {
    }

    public FastFood(float price, String desc) {
        this.price = price;
        this.desc = desc;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public float getPrice() {
        return price;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public abstract float cost();  //获取价格
}

2)炒饭、炒面(具体的构件角色)

//炒饭
public class FriedRice extends FastFood {

    public FriedRice() {
        super(10, "炒饭");
    }

    public float cost() {
        return getPrice();
    }
}

//炒面
public class FriedNoodles extends FastFood {

    public FriedNoodles() {
        super(12, "炒面");
    }

    public float cost() {
        return getPrice();
    }
}

3)配料类-装饰类

上一篇:第四章 保护模式入门


下一篇:如何查询最后一行的记录