Java中的装饰器模式

在Java中,装饰器模式允许我们动态地给对象添加新的行为或责任,而无需修改原有类。以下是一个简单的装饰器模式示例,我们将模拟一个咖啡销售系统,其中基础饮料类(Component)是Coffee,装饰器类(Decorator)用来添加额外的调料。

首先,定义抽象组件------基础咖啡接口:

java 复制代码
// 抽象组件(Component)
public interface Coffee {
    double getCost(); // 获取咖啡价格
    String getDescription(); // 获取咖啡描述
}

// 具体组件(ConcreteComponent)
public class SimpleCoffee implements Coffee {
    @Override
    public double getCost() {
        return 1.0; // 基础咖啡的价格
    }

    @Override
    public String getDescription() {
        return "Simple Coffee"; // 基础咖啡的描述
    }
}

接下来,创建装饰器接口:

java 复制代码
// 装饰器接口(Decorator)
public abstract class CoffeeDecorator implements Coffee {
    protected Coffee coffee; // 维持对组件对象的引用

    public CoffeeDecorator(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public double getCost() {
        return coffee.getCost(); // 默认调用原始咖啡的价格
    }

    @Override
    public String getDescription() {
        return coffee.getDescription(); // 默认调用原始咖啡的描述
    }
}

然后,我们创建几个具体的装饰器类,它们会附加额外的功能(比如添加糖、奶或者巧克力):

java 复制代码
// 具体装饰器 - 添加糖
public class SugarDecorator extends CoffeeDecorator {
    private static final double SUGAR_COST = 0.25;

    public SugarDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + SUGAR_COST; // 在原始咖啡价格基础上增加糖的成本
    }

    @Override
    public String getDescription() {
        return coffee.getDescription() + ", With Sugar"; // 更新描述信息
    }
}

// 具体装饰器 - 添加牛奶
public class MilkDecorator extends CoffeeDecorator {
    private static final double MILK_COST = 0.5;

    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + MILK_COST; // 在原始咖啡价格基础上增加牛奶的成本
    }

    @Override
    public String getDescription() {
        return coffee.getDescription() + ", With Milk"; // 更新描述信息
    }
}

// 可以继续定义其他装饰器,如ChocolateDecorator等...

最后,在客户端代码中,我们可以动态地构建不同口味的咖啡:

java 复制代码
public class CoffeeShop {
    public static void main(String[] args) {
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println(simpleCoffee.getDescription() + " costs: " + simpleCoffee.getCost());

        Coffee coffeeWithSugar = new SugarDecorator(simpleCoffee);
        System.out.println(coffeeWithSugar.getDescription() + " costs: " + coffeeWithSugar.getCost());

        Coffee coffeeWithMilkAndSugar = new MilkDecorator(coffeeWithSugar);
        System.out.println(coffeeWithMilkAndSugar.getDescription() + " costs: " + coffeeWithMilkAndSugar.getCost());
    }
}

运行上述代码后,将会输出每种咖啡的描述和对应的价格,展示了如何通过装饰器模式动态地添加不同的调料并计算总成本。

相关推荐
大G的笔记本1 分钟前
BIO(Blocking I/O) 和 NIO(Non‑Blocking I/O) 两种不同的 I/O 模型
java·nio
rannn_1113 分钟前
【Redis|高级篇3】Redis最佳实践|键值设计、批处理优化、服务端优化、服务器优化、集群还是主从
java·服务器·redis·后端·缓存
matlabgoodboy3 分钟前
留学生计算机cs作业辅导java SQL数据库 c语言编程 软件工程辅导
java·数据库·sql
aXin_ya8 分钟前
微服务 第一天
java·运维·微服务
8Qi812 分钟前
Elasticsearch 初识篇:核心概念与环境搭建
java·大数据·分布式·elasticsearch·搜索引擎·中间件
消失的旧时光-194322 分钟前
Spring 核心思想解析:IoC 与 DI 一文讲透(从入门到工程理解)
java·ioc·di
小梁努力敲代码25 分钟前
抽奖系统-测试报告
java·功能测试
devpotato42 分钟前
人工智能(九)- Spring AI MCP客户端开发
java·mcp
疯狂打码的少年1 小时前
【Day14 Java转Python】从Java到Python——用Python重构一个Java小工具(文件批量重命名实战)
java·python·重构
Q741_1471 小时前
设计模式之装饰器模式 理论总结 C++代码实战
c++·设计模式·装饰器模式