其他分享
首页 > 其他分享> > 结构型模式——装饰者模式

结构型模式——装饰者模式

作者:互联网

一、介绍

装饰者模式是一种结构型模式,通过这种模式,可以动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

二、案例分析

还是以传说中的星巴克咖啡馆咖啡订单问题说事儿:

1)、不采用装饰者模式

2)、采用装饰者模式

三、案例实现

import java.math.BigDecimal;

/**
 * 饮料抽象类
 *
 * @author zhangxs
 **/
public abstract class Beverage {
    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    /**
     * cost方法是用来返回饮料的价钱(需在具体类中实现)
     */
    public abstract BigDecimal cost();
}
import java.math.BigDecimal;

/**
 * 深焙咖啡类(一种具体的饮料)
 *
 * @author zhangxs
 **/
public class DarkRoast extends Beverage {
    /**
     * 说明他是DarkRoast饮料
     */
    public DarkRoast() {
        description = "DarkRoast";
    }

    /**
     * 实现cost方法,用来返回DarkRoast(深焙咖啡)的价格
     */
    @Override
    public BigDecimal cost() {
        return new BigDecimal("3.00");
    }
}
import java.math.BigDecimal;

/**
 * 低咖啡因咖啡类(一种具体的饮料)
 *
 * @author zhangxs
 **/
public class Decaf extends Beverage {
    /**
     * 说明他是Decaf饮料
     */
    public Decaf() {
        description = "Decaf";
    }

    /**
     * 实现cost方法,用来返回Decaf(低咖啡因咖啡)的价格
     */
    @Override
    public BigDecimal cost() {
        return new BigDecimal("4.00");
    }
}
import java.math.BigDecimal;

/**
 * 浓缩咖啡类(一种具体饮料)
 *
 * @author zhangxs
 **/
public class Espresso extends Beverage {
    /**
     * 说明他是Espresso饮料
     */
    public Espresso() {
        description = "Espresso";
    }

    /**
     * 实现cost方法,用来返回Espresso(浓缩咖啡)的价格
     */
    @Override
    public BigDecimal cost() {
        return new BigDecimal("2.00");
    }
}
/**
 * 调料装饰着抽象类(继承自饮料抽象类)
 *
 * @author zhangxs
 **/
public abstract class CondimentDecorator extends Beverage {
    /**
     * 所有的调料装饰者都必须重新实现getDescription()方法
     * 这样才能够用递归的方式来得到所选饮料的整体描述
     */
    @Override
    public abstract String getDescription();
}
import java.math.BigDecimal;

/**
 * 摩卡调料类(继承自CondimentDecorator)
 *
 * @author zhangxs
 **/
public class Mocha extends CondimentDecorator {
    /**
     * 用一个实例变量记录饮料,也就是被装饰者
     */
    Beverage beverage;

    /**
     * 构造器初始化饮料变量
     */
    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    /**
     * 在原来饮料的基础上添加上Mocha描述(原来的饮料加入Mocha调料,被Mocha调料装饰)
     */
    @Override
    public String getDescription() {
        return beverage.getDescription() + ",Mocha";
    }

    /**
     * 在原来饮料的基础上加上Mocha的价格(原来的饮料加入Mocha调料,被Mocha调料装饰)
     */
    @Override
    public BigDecimal cost() {
        return new BigDecimal("0.2").add(beverage.cost());
    }
}
import java.math.BigDecimal;

/**
 * 豆浆调料类(继承自CondimentDecorator)
 *
 * @author zhangxs
 **/
public class Soy extends CondimentDecorator {
    /**
     * 用一个实例变量记录饮料,也就是被装饰者
     */
    Beverage beverage;

    /**
     * 构造器初始化饮料变量
     */
    public Soy(Beverage beverage) {
        this.beverage = beverage;
    }

    /**
     * 在原来饮料的基础上添加上Soy描述(原来的饮料加入Soy调料,被Soy调料装饰)
     */
    @Override
    public String getDescription() {
        return beverage.getDescription() + ",Soy";
    }

    /**
     * 在原来饮料的基础上加上Soy的价格(原来的饮料加入Soy调料,被Soy调料装饰)
     */
    @Override
    public BigDecimal cost() {
        return new BigDecimal("0.3").add(beverage.cost());
    }
}
import java.math.BigDecimal;

/**
 * 奶泡调料类(继承自CondimentDecorator)
 *
 * @author zhangxs
 **/
public class Whip extends CondimentDecorator {
    /**
     * 用一个实例变量记录饮料,也就是被装饰者
     */
    Beverage beverage;

    /**
     * 构造器初始化饮料变量
     */
    public Whip(Beverage beverage) {
        this.beverage = beverage;
    }

    /**
     * 在原来饮料的基础上添加上Whip描述(原来的饮料加入Whip调料,被Whip调料装饰)
     */
    @Override
    public String getDescription() {
        return beverage.getDescription() + ",Whip";
    }

    /**
     * 在原来饮料的基础上加上Whip的价格(原来的饮料加入Whip调料,被Whip调料装饰)
     */
    @Override
    public BigDecimal cost() {
        return new BigDecimal("0.4").add(beverage.cost());
    }
}
/**
 * 咖啡馆(供应咖啡)
 *
 * @author zhangxs
 **/
public class StarbuzzCoffee {
    public static void main(String[] args) {
        // 订一杯Espresso(2.00),不需要调料,打印出它的描述与价钱。
        Beverage beverage = new Espresso();
        System.out.println("Description: " + beverage.getDescription() + " $" + beverage.cost());

        // 制造出一个DarkRoast(3.00)对象,用Mocha(0.2)装饰它,用第二个Mocha(0.2)装饰它,用Whip(0.4)装饰它,打印出它的描述与价钱。
        Beverage beverage2 = new DarkRoast();
        beverage2 = new Mocha(beverage2);
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        System.out.println("Description: " + beverage2.getDescription() + " $" + beverage2.cost());

        // 再来一杯调料为豆浆(Soy 0.3)、摩卡(Mocha 0.2)、奶泡(Whip 0.4)的Decaf(低咖啡因咖啡 4.00),打印出它的描述与价钱。
        Beverage beverage3 = new Decaf();
        beverage3 = new Soy(beverage3);
        beverage3 = new Mocha(beverage3);
        beverage3 = new Whip(beverage3);
        System.out.println("Description: " + beverage3.getDescription() + " $" + beverage3.cost());
    }
}
Description: Espresso $2.00
Description: DarkRoast,Mocha,Mocha,Whip $3.80
Description: Decaf,Soy,Mocha,Whip $4.90

四、总结

标签:BigDecimal,模式,装饰,饮料,调料,beverage,public,结构型
来源: https://blog.csdn.net/weixin_38264394/article/details/118193168