你知道什么是装饰者模式吗?

这篇博客介绍了装饰者模式的概念及其在咖啡饮品系统中的应用。通过饮料类`Beverage`和装饰者类`CondimentDecorator`,实现了不同种类咖啡的组合与价格计算。例如,意大利浓咖啡、深度烘焙咖啡和混合咖啡等,可以添加摩卡、豆浆或奶泡等配料。在测试类中展示了如何创建和装饰饮品,输出了不同组合的价格和描述,体现了装饰者模式的灵活性。
摘要由CSDN通过智能技术生成

一、装饰者模式

动态地将责任附加到对象上。想要扩展功能,装饰提供有别于继承的另一种选择。

二、举例

设计一个饮料类,要求如下

  • 有饮料的名称,价格
  • 可以给饮料加配料

饮料类

package com.jackeys.DecoratorMode;

/**
 * @Description: 饮料类
 * @ClassName: Beverage
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:22
 * @Version: 1.0
 */
public abstract class Beverage {
    /**
     * 饮料描述
     */
    String description = "未知饮料";

    /**
     * 返回饮料描述
     * @return String
     */
    public String getDescription() {
        return this.description;
    }

    /**
     * 计算价格
     * @return double
     */
    public abstract double cost();
}

装饰者类

package com.jackeys.DecoratorMode;

/**
 * @Description: 调料类,装饰者类
 * @ClassName: Condiment
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:25
 * @Version: 1.0
 */
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}

深度烘焙咖啡类

package com.jackeys.DecoratorMode;

/**
 * @Description: 深度烘焙咖啡
 * @ClassName: DarkRoast
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:47
 * @Version: 1.0
 */
public class DarkRoast extends Beverage{

    public DarkRoast(){
        this.description="深度烘焙咖啡";
    }
    @Override
    public double cost() {
        return 0.89;
    }
}

意大利浓咖啡类

package com.jackeys.DecoratorMode;

/**
 * @Description: 意大利浓咖啡
 * @ClassName: Espresso
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:28
 * @Version: 1.0
 */
public class Espresso extends Beverage{

    public Espresso(){
        this.description="意大利浓咖啡";
    }
    @Override
    public double cost() {
        return 1.99;
    }
}

混合咖啡类

package com.jackeys.DecoratorMode;

/**
 * @Description: 混合咖啡
 * @ClassName: HouseBlend
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:31
 * @Version: 1.0
 */
public class HouseBlend extends Beverage{

    public HouseBlend(){
        this.description="混合咖啡";
    }
    @Override
    public double cost() {
        return 0.89;
    }
}

摩卡类

package com.jackeys.DecoratorMode;

/**
 * @Description: 摩卡
 * @ClassName: Mocha
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:33
 * @Version: 1.0
 */
public class Mocha extends CondimentDecorator {

    Beverage beverage;

    public Mocha(Beverage beverage){
        this.beverage=beverage;
    }
    @Override
    public double cost() {
        return 0.20+this.beverage.cost();
    }

    @Override
    public String getDescription() {
        return this.beverage.getDescription()+",摩卡";
    }
}

豆浆类

package com.jackeys.DecoratorMode;

/**
 * @Description: 豆浆
 * @ClassName: Soy
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:35
 * @Version: 1.0
 */
public class Soy extends CondimentDecorator {

    Beverage beverage;
    public Soy(Beverage beverage){
        this.beverage=beverage;
    }
    @Override
    public double cost() {
        return 0.88+this.beverage.cost();
    }

    @Override
    public String getDescription() {
        return this.beverage.getDescription()+",豆浆";
    }
}

奶泡类

package com.jackeys.DecoratorMode;

/**
 * @Description: 奶泡
 * @ClassName: Whip
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:40
 * @Version: 1.0
 */
public class Whip extends CondimentDecorator{
    Beverage beverage;

    public Whip(Beverage beverage){
        this.beverage=beverage;
    }
    @Override
    public double cost() {
        return 0.77+this.beverage.cost();
    }

    @Override
    public String getDescription() {
        return this.beverage.getDescription()+",奶泡";
    }
}

测试类

package com.jackeys.DecoratorMode;

/**
 * @Description: 测试装饰者模式
 * @ClassName: Test
 * @Package com.jackeys.DecoratorMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/7 9:43
 * @Version: 1.0
 */
public class Test {
    public static void main(String[] args) {
        Beverage beverage1=new Espresso();
        System.out.println(beverage1.getDescription()+"的价格是"+beverage1.cost()+"美元");
        System.out.println("===========================");
        Beverage beverage2=new DarkRoast();
        beverage2=new Mocha(beverage2);
        beverage2=new Mocha(beverage2);
        beverage2=new Whip(beverage2);
        System.out.println(beverage2.getDescription()+"的价格是"+beverage2.cost()+"美元");
        System.out.println("===========================");
        Beverage beverage3=new HouseBlend();
        beverage3=new Soy(beverage3);
        beverage3=new Mocha(beverage3);
        beverage3=new Whip(beverage3);
        System.out.println(beverage3.getDescription()+"的价格是"+beverage3.cost()+"美元");
        System.out.println("===========================");
    }
}

输出
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值