装饰器模式(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)组合在一起,从而实现了功能的扩展。

相关推荐
市场部需要一个软件开发岗位10 分钟前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
历程里程碑22 分钟前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
执风挽^39 分钟前
Python基础编程题2
开发语言·python·算法·visual studio code
程序员泠零澪回家种桔子41 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
Z9fish1 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
CodeCaptain1 小时前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
萧鼎1 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
Anastasiozzzz2 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人2 小时前
通过脚本推送Docker镜像
java·docker·容器
刘琦沛在进步2 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++