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 是具体的装饰者,它们分别给咖啡添加了牛奶和糖。客户端代码演示了如何动态地添加装饰者来改变咖啡的描述和成本。这种模式的好处是,我们可以在不修改现有代码的情况下,通过添加更多的装饰者来扩展功能。

相关推荐
小毛驴85015 分钟前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
枯萎穿心攻击22 分钟前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
DKPT1 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
Eiceblue2 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
好奇的菜鸟2 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
m0_555762902 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
浪裡遊3 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
优创学社23 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理3 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring