当前位置: 首页 > article >正文

装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给对象添加新的行为,而不改变其结构。以下是一个用 Java 实现的装饰器模式示例:

示例:咖啡店

假设你有一个咖啡店,咖啡有不同的类型(如 Espresso、Latte),并且可以添加不同的调料(如牛奶、糖、巧克力)。你希望能够动态地给咖啡添加这些调料。

代码实现

  1. 创建 Beverage 接口:这是所有饮料类的公共接口。
public interface Beverage {
    String getDescription();
    double cost();
}
  1. 创建具体的饮料类:如 Espresso 和 Latte。
public class Espresso implements Beverage {
    @Override
    public String getDescription() {
        return "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

public class Latte implements Beverage {
    @Override
    public String getDescription() {
        return "Latte";
    }

    @Override
    public double cost() {
        return 2.99;
    }
}
  1. 创建装饰器抽象类:所有的调料装饰器都需要继承这个类。
public abstract class CondimentDecorator implements Beverage {
    protected Beverage beverage;

    public CondimentDecorator(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription();
    }

    @Override
    public double cost() {
        return beverage.cost();
    }
}
  1. 创建具体的装饰器类:如牛奶和巧克力。
public class Milk extends CondimentDecorator {
    public Milk(Beverage beverage) {
        super(beverage);
    }

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

    @Override
    public double cost() {
        return beverage.cost() + 0.5;
    }
}

public class Chocolate extends CondimentDecorator {
    public Chocolate(Beverage beverage) {
        super(beverage);
    }

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

    @Override
    public double cost() {
        return beverage.cost() + 0.7;
    }
}
  1. 客户端代码:使用装饰器模式来创建饮料,并添加调料。
public class CoffeeShop {
    public static void main(String[] args) {
        // 创建一个Espresso,不加任何调料
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        // 创建一个加牛奶的Latte
        Beverage latteWithMilk = new Milk(new Latte());
        System.out.println(latteWithMilk.getDescription() + " $" + latteWithMilk.cost());

        // 创建一个加牛奶和巧克力的Espresso
        Beverage espressoWithMilkAndChocolate = new Chocolate(new Milk(new Espresso()));
        System.out.println(espressoWithMilkAndChocolate.getDescription() + " $" + espressoWithMilkAndChocolate.cost());
    }
}

输出结果

Espresso $1.99
Latte, Milk $3.49
Espresso, Milk, Chocolate $3.19

这个例子展示了如何使用装饰器模式来动态地给对象添加功能。在这个例子中,每个调料(如牛奶和巧克力)都作为一个装饰器,通过组合的方式与基本饮料对象(如 Espresso 和 Latte)组合在一起,从而实现了功能的扩展。


http://www.kler.cn/a/289817.html

相关文章:

  • MySQL数据库:SQL语言入门 【下】(学习笔记)
  • Android中桌面小部件的开发流程及常见问题和解决方案
  • redhat虚拟机
  • LeetCode【0036】有效的数独
  • Unity3D
  • vwmare虚拟机繁忙的解决办法
  • MACOS安装配置前端开发环境
  • 北芯生命持续亏损:产能利用率不理想仍扩产能,销售费用越来越高
  • Python世界:文件自动化备份实践
  • 由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
  • 工业交换机如何确保品质
  • glsl着色器学习(四)
  • 日常避坑指南:如何合理利用Swap优化MongoDB内存管理
  • Linux驱动开发基础(IRDA 红外遥控模块)
  • E6000物联网主机:打造智慧楼宇的未来
  • Linux:vim编辑器的基本使用
  • 不小心删除丢失了所有短信?如何在 iPhone 上查找和恢复误删除的短信
  • 6 自研rgbd相机基于rk3566之深度计算库移植及测试
  • Spring Boot集成Spring Cloud Scheduler进行任务调度
  • 如何使用Spoon连接data-integration-server并在服务器上执行转换
  • nginx配置白名单服务
  • Gnu: binutils: ld: .gnu.warning.链接时的主动警告 glibc
  • IP地址与物理地址:‌区别解析及在网络通信中的作用
  • 开始使用 ROS 工具箱
  • 3144. 分割字符频率相等的最少子字符串
  • C#Is和As的区别: