装饰器模式

装饰器模式(Decorator Pattern)是一种结构设计模式,它允许用户在不修改对象自身的基础上,向一个对象添加新的功能。这种模式通过创建一个包装对象,也就是装饰者,来包裹实际对象。装饰者模式通常用于遵循单一职责原则的场景,允许在运行时动态地给对象添加职责。

  1. Component 接口:定义了可以动态添加职责的对象接口。
  2. ConcreteComponent 类:实现了 Component 接口的具体对象。
  3. Decorator 抽象类:实现了 Component 接口,并持有一个 Component 接口的引用,可以是具体组件或者另一个装饰者。
  4. ConcreteDecorator 类:继承了 Decorator 抽象类,向 ConcreteComponent 对象添加额外的职责。

假设我们有一个简单的咖啡店,我们想要根据不同的客户需求,动态地给咖啡添加不同的调料。

首先,我们定义咖啡的接口:

java 复制代码
public interface Coffee {
    double cost();
}

然后,我们创建一个具体的咖啡类:

java 复制代码
public class SimpleCoffee implements Coffee {
    
    @Override
    public double cost() {
        return 10; // 假设咖啡的基础价格是10元
    }
    
}

接下来,我们创建一个装饰者抽象类:

java 复制代码
public abstract class CoffeeDecorator implements Coffee {
    
    protected Coffee decoratedCoffee;

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

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

现在,我们可以创建一些具体的装饰者类,来向咖啡添加不同的调料:

java 复制代码
public class MilkCoffeeDecorator extends CoffeeDecorator {
    
    public MilkCoffeeDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double cost() {
        return decoratedCoffee.cost() + 2; // 牛奶咖啡额外加2元
    }
    
}

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

    @Override
    public double cost() {
        return decoratedCoffee.cost() + 1; // 奶油咖啡额外加1元
    }
    
}

最后,在客户端代码中,我们可以根据需要动态地添加装饰者:

java 复制代码
public class DecoratorPatternDemo {
    
    public static void main(String[] args) {
        
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println("Cost of Simple Coffee: " + simpleCoffee.cost());

        Coffee milkCoffee = new MilkCoffeeDecorator(simpleCoffee);
        System.out.println("Cost of Milk Coffee: " + milkCoffee.cost());

        Coffee whipCoffee = new WhipCoffeeDecorator(milkCoffee);
        System.out.println("Cost of Whip Coffee: " + whipCoffee.cost());
        
    }
    
}

在这个示例中,Coffee 是 Component 接口,SimpleCoffee 是 ConcreteComponent 类,CoffeeDecorator 是 Decorator 抽象类,而 MilkCoffeeDecorator 和 WhipCoffeeDecorator 是 ConcreteDecorator 类。客户端代码通过装饰者来动态地向咖啡添加不同的调料,而不需要修改咖啡本身的代码。

装饰者模式提供了一种灵活的方式来扩展对象的功能,可以在不修改对象自身的情况下,通过包装对象来增加新的行为。这种模式也支持链式结构,允许多个装饰者依次包装一个对象。

相关推荐
Zane19942 小时前
工厂方法一定比简单工厂高级?三种工厂模式到底该怎么选
设计模式
Hespethorn3 小时前
设计模式是语言缺陷的补丁 —— 从工厂、单例、策略三个模式说起
设计模式
Lost of 程序猿3 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
一只旭宝3 小时前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
YYYing.5 小时前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++
Zane19941 天前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
小酒星小杜1 天前
画 AI 漫画,别只会写“日漫风”:10 种画风、适用故事和可复制提示词
人工智能·设计模式·程序员
sarasuki1 天前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp
vivo互联网技术1 天前
知识不是文件,也不是向量 | KDC 系列 02
人工智能·设计模式·架构