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

相关推荐
Rain的Java大神之路5 分钟前
LeetCode 21 合并两个有序链表:一道 Easy 题,凭什么刷掉一半候选人?
java·后端·算法
小白的码BUG之路9 分钟前
K8S -- 集群搭建环境基础
java·服务器·kubernetes
w_t_y_y10 分钟前
JWT(5)JWT+spring security
java·后端·spring
是2的10次方啊12 分钟前
设计模式与生活⑥:问题一个个砸过来,先写张便签
设计模式
wenyq720 分钟前
LeetCode 152. Maximum Product Subarray
java·算法·leetcode
余额瞒着我当琳22 分钟前
C++异常,异常的概念,异常抛出与捕获,RAII 和智能指针的设计思路,C++标准库一些指针的使用
java·开发语言·c++·算法
花间相见38 分钟前
【macOS开发环境:Java配置】—— Mac上的Java版本管理-SDKMAN安装、多版本切换与项目实战
java·架构·个人开发
骑着蜗牛撵大象32743 分钟前
大模型 SDK 编译就崩?用 CMakeLists 把 httplib、JSON 与 OpenSSL 装配成可复用的 ChatServer
android·java·c++·http·json·cmake·大模型sdk
码智社1 小时前
Redis生产环境高频踩坑总结(Java后端视角)
java·数据库·redis