装饰器模式(Decorator Pattern)

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

示例:咖啡店

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

代码实现

  1. 创建 Beverage 接口:这是所有饮料类的公共接口。
java 复制代码
public interface Beverage {
    String getDescription();
    double cost();
}
  1. 创建具体的饮料类:如 Espresso 和 Latte。
java 复制代码
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. 创建装饰器抽象类:所有的调料装饰器都需要继承这个类。
java 复制代码
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. 创建具体的装饰器类:如牛奶和巧克力。
java 复制代码
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. 客户端代码:使用装饰器模式来创建饮料,并添加调料。
java 复制代码
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());
    }
}

输出结果

plaintext 复制代码
Espresso $1.99
Latte, Milk $3.49
Espresso, Milk, Chocolate $3.19

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

相关推荐
wuminyu4 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人11 分钟前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒23 分钟前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼27 分钟前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ1 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油1 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦1 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp2 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy2 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
2zcode2 小时前
基于MATLAB元胞自动机(CA)的AZ80A镁合金动态再结晶(DRX)过程模拟
开发语言·matlab·动态再结晶