java设计模式 - 装饰者模式

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持原类方法签名的同时,增添了额外的功能。

想学习springboot,springboot+vue项目,SpringCloudAlibaba的小伙伴,可以免费观看视频地址:

springcloudalibaba地址:

html 复制代码
https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112

springboot地址:

html 复制代码
https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112

springboot+vue案例地址:

html 复制代码
```html
https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112
复制代码
### 装饰者模式的主要角色:

1. **Component(抽象组件)**:定义了对象的接口,可以给这些对象动态地添加职责。
2. **ConcreteComponent(具体组件)**:定义了对象将引用其角色的类。
3. **Decorator(抽象装饰者)**:持有一个组件对象的引用,并定义一个与抽象组件接口相同的接口。
4. **ConcreteDecorator(具体装饰者)**:负责给组件添加额外的功能。

### Java简单案例:

假设我们有一个简单的咖啡店,我们可以订购"咖啡",但顾客也可以选择添加"牛奶"或"糖"等调料。我们可以使用装饰者模式来实现这个功能。

 1. 定义抽象组件(Component)

```java
public abstract class Coffee {
    public abstract String getDescription();

    public abstract double cost();
}
2. 创建具体组件(ConcreteComponent)
java 复制代码
public class SimpleCoffee extends Coffee {
    @Override
    public String getDescription() {
        return "Simple Coffee";
    }

    @Override
    public double cost() {
        return 1.0;
    }
}
3. 创建抽象装饰者(Decorator)
java 复制代码
public abstract class CoffeeDecorator extends Coffee {
    protected Coffee decoratedCoffee;

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

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

    @Override
    public double cost() {
        return decoratedCoffee.cost();
    }
}
4. 创建具体装饰者(ConcreteDecorator)
java 复制代码
public class MilkCoffeeDecorator extends CoffeeDecorator {
    public MilkCoffeeDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return decoratedCoffee.getDescription() + ", with milk";
    }

    @Override
    public double cost() {
        return decoratedCoffee.cost() + 0.5;
    }
}

public class SugarCoffeeDecorator extends CoffeeDecorator {
    public SugarCoffeeDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return decoratedCoffee.getDescription() + ", with sugar";
    }

    @Override
    public double cost() {
        return decoratedCoffee.cost() + 0.2;
    }
}
5. 客户端代码
java 复制代码
public class Client {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        System.out.println("Cost: " + coffee.cost() + ", Description: " + coffee.getDescription());

        Coffee milkCoffee = new MilkCoffeeDecorator(coffee);
        System.out.println("Cost: " + milkCoffee.cost() + ", Description: " + milkCoffee.getDescription());

        Coffee milkSugarCoffee = new SugarCoffeeDecorator(milkCoffee);
        System.out.println("Cost: " + milkSugarCoffee.cost() + ", Description: " + milkSugarCoffee.getDescription());
    }
}

在这个案例中,SimpleCoffee 是一个具体的咖啡组件,而 MilkCoffeeDecoratorSugarCoffeeDecorator 是具体的装饰者,它们分别给咖啡添加了牛奶和糖。客户端代码演示了如何动态地添加装饰者来改变咖啡的描述和成本。这种模式的好处是,我们可以在不修改现有代码的情况下,通过添加更多的装饰者来扩展功能。

相关推荐
百***35515 分钟前
什么是Spring Boot 应用开发?
java·spring boot·后端
孟祥_成都7 分钟前
下一代组件的奥义在此!headless 组件构建思想探索!
前端·设计模式·架构
爱吃烤鸡翅的酸菜鱼8 分钟前
如何用【rust】做一个命令行版的电子辞典
开发语言·rust
不爱学英文的码字机器19 分钟前
Rust 并发实战:使用 Tokio 构建高性能异步 TCP 聊天室
开发语言·tcp/ip·rust
謝堆堆DDD31 分钟前
eclipse由只运行java文件到创建web项目
java·ide·eclipse
redtro9543 分钟前
【开发备忘】GeoServer相关两则:发布时间维ImageMosaic+客户端WMS样式
java·开发语言·spring
..空空的人1 小时前
C++基于websocket的多用户网页五子棋 ---- 模块介绍1
开发语言·c++·websocket
代码不停1 小时前
Java模拟算法题目练习
java·开发语言·算法
百***26631 小时前
Tomcat的server.xml配置详解
xml·java·tomcat
彡皮1 小时前
基于Qt,调用千问7B大模型,实现智能对话
开发语言·qt·大模型·千问7b