装饰模式(Decorator)

2018-11-09  本文已影响0人  fomin

1、概念

装饰模式动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活,属于结构性模式一种。


图片

2、模式结构

3、使用场景

4、优缺点

优点:

缺点:

5、实例

在购买奶茶的时候,经常会有选择配料的选项,每种配料的价格不一样,可以多种组合,价格也不一样。首先先定义奶茶的接口,具有名称和价格方法

public interface IMilkTea {

    String name();

    double price();
}

继承IMilkTea的相关茶类

public class RedTea implements IMilkTea {

    @Override
    public String name() {
        return "红茶";
    }

    @Override
    public double price() {
        return 10;
    }
}
public class GreenTea implements IMilkTea {

    @Override
    public String name() {
        return "绿茶";
    }

    @Override
    public double price() {
        return 12;
    }
}

定义具体装饰类Decorator,装饰相关奶茶

public class Decorator implements IMilkTea {

    @Override
    public String name() {
        return null;
    }

    @Override
    public double price() {
        return 0;
    }
}

继承Decorator的相关类

public class IceCream extends Decorator {

    private String name = "加雪糕";
    private IMilkTea milkTea;

    public IceCream(IMilkTea milkTea) {
        this.milkTea = milkTea;
    }

    @Override
    public String name() {
        return milkTea.name() + name;
    }

    @Override
    public double price() {
        return milkTea.price() + 3;
    }
}
public class Pearl extends Decorator {
    private String name = "加珍珠";
    private IMilkTea milkTea;

    public Pearl(IMilkTea milkTea) {
        this.milkTea = milkTea;
    }

    @Override
    public String name() {
        return milkTea.name() + name;
    }

    @Override
    public double price() {
        return milkTea.price() + 2;
    }
}

客户端使用

public static void main(String[] args) {
    IMilkTea milkTea = new RedTea();
    milkTea = new IceCream(milkTea);
    milkTea = new Pearl(milkTea);
    System.out.println(milkTea.name() + "\n价格:" + milkTea.price());
}
上一篇 下一篇

猜你喜欢

热点阅读