Java设计模式中装饰器模式(套娃)

装饰器模式是一种结构型设计模式,它允许你在不改变对象自身的情况下动态地给对象添加新的功能。这种模式通过将对象放入装饰器对象中,然后将装饰器对象包装在其他装饰器对象中,以实现各种功能的组合。这种模式符合开放封闭原则,即对扩展是开放的,对修改是封闭的。

以下是装饰器模式的一般结构:

  1. Component(组件):定义了一个对象接口,可以给这些对象动态地添加功能。

  2. ConcreteComponent(具体组件):实现了Component接口的具体对象。

  3. Decorator(装饰器):持有一个Component对象的引用,并定义一个与Component接口一致的接口。

  4. ConcreteDecorator(具体装饰器):实现了Decorator接口的具体装饰器,负责给Component对象添加新的功能。

下面是一个简单的Java示例,演示了如何使用装饰器模式:

java 复制代码
// 1. Component
interface Coffee {
    double getCost();
    String getDescription();
}

// 2. ConcreteComponent
class SimpleCoffee implements Coffee {
    @Override
    public double getCost() {
        return 1.0;
    }
    
    @Override
    public String getDescription() {
        return "Coffee";
    }
}

// 3. Decorator
abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

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

    public double getCost() {
        return decoratedCoffee.getCost();
    }

    public String getDescription() {
        return decoratedCoffee.getDescription();
    }
}

// 4. ConcreteDecorator
class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }

    public double getCost() {
        return super.getCost() + 0.5;
    }

    public String getDescription() {
        return super.getDescription() + ", Milk";
    }
}

// 5. 使用示例
public class Main {
    public static void main(String[] args) {
        // 制作一杯简单咖啡
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println("Cost: " + simpleCoffee.getCost() + ", Description: " + simpleCoffee.getDescription());

        // 给简单咖啡加入牛奶
        Coffee milkCoffee = new MilkDecorator(simpleCoffee);
        System.out.println("Cost: " + milkCoffee.getCost() + ", Description: " + milkCoffee.getDescription());
    }
}

在这个示例中,SimpleCoffee是具体组件,MilkDecorator是具体装饰器。我们可以动态地给简单咖啡添加额外的功能,比如牛奶。

相关推荐
期待のcode23 分钟前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐26 分钟前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲35 分钟前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红36 分钟前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥38 分钟前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v1 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地1 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209251 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei1 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot
记得开心一点嘛2 小时前
Redis封装类
java·redis