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

相关推荐
The Future is mine1 分钟前
Python计算经纬度两点之间距离
开发语言·python
Enti7c2 分钟前
HTML5和CSS3的一些特性
开发语言·css3
腥臭腐朽的日子熠熠生辉7 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
爱吃巧克力的程序媛9 分钟前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt
ejinxian9 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之15 分钟前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码35 分钟前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
独好紫罗兰1 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿