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是具体装饰器。我们可以动态地给简单咖啡添加额外的功能,比如牛奶。

相关推荐
架构师沉默42 分钟前
别又牛逼了!AI 写 Java 代码真的行吗?
java·后端·架构
后端AI实验室5 小时前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai
凉年技术7 小时前
Java 实现企业微信扫码登录
java·企业微信
狂奔小菜鸡8 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum8 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
程序员Terry9 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP9 小时前
MyBatis-缓存与注解式开发
java
码路飞9 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java
Re_zero9 小时前
以为用了 try-with-resources 就稳了?这三个底层漏洞让TCP双向通讯直接卡死
java·后端
SimonKing9 小时前
Fiddler抓包完全指南:从安装配置到抓包,一文讲透
java·后端·程序员