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

相关推荐
若亦_2 分钟前
Java泛型入门:类型安全与上界约束
java·1024程序员节
凉茶钱3 分钟前
stack、queue、priority_queue、容器适配器完整梳理
开发语言·c++·queue·1024程序员节·stack
编程的一拳超人3 分钟前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent
wuminyu11 分钟前
JVM规范学习总结-Java源码经过javac编译后产物
java·linux·c语言·jvm·c++
ly768917 分钟前
Spring Security 过滤器链定制:认证、CORS 与 CSRF 的先后顺序
java·spring boot·spring·spring security·csrf·cors·过滤器链
云和数据.ChenGuang20 分钟前
Python 菜鸟入门:字典(dict)类型详解与 CRUD 实战案例
开发语言·人工智能·python
yuniko-n30 分钟前
【JUC】读写锁 StampedLock
java·1024程序员节
攻城狮Soar36 分钟前
详解volatile
开发语言·c++·1024程序员节
小羊没烦恼!36 分钟前
.NET无侵入自动化探针原理和主流实现
运维·开发语言·javascript·python·自动化·.net·1024程序员节
文丑颜不良啊36 分钟前
LeetCode701~725题目解析
java·leetcode