GPT带我学-设计模式17-装饰器模式

概述

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许你在不改变对象接口的前提下,动态地给对象添加新功能。这个模式通常用于扩展类的功能。

基本结构

  1. 组件接口(Component):定义一个接口,包含基本的方法。
  2. 具体组件(ConcreteComponent):实现组件接口的类,是被装饰的对象。
  3. 装饰器(Decorator):实现组件接口,并持有一个组件的引用,通常会重写接口中的方法来添加新功能。
  4. 具体装饰器(ConcreteDecorator):继承装饰器类,增加具体的功能。

示例代码

假设我们有一个简单的文本组件,我们希望添加一些装饰,比如加粗和斜体。

java 复制代码
// 组件接口
interface Text {
    String getContent();
}

// 具体组件
class SimpleText implements Text {
    private String content;

    public SimpleText(String content) {
        this.content = content;
    }

    @Override
    public String getContent() {
        return content;
    }
}

// 装饰器
abstract class TextDecorator implements Text {
    protected Text decoratedText;

    public TextDecorator(Text decoratedText) {
        this.decoratedText = decoratedText;
    }

    @Override
    public String getContent() {
        return decoratedText.getContent();
    }
}

// 具体装饰器:加粗
class BoldDecorator extends TextDecorator {
    public BoldDecorator(Text decoratedText) {
        super(decoratedText);
    }

    @Override
    public String getContent() {
        return "<b>" + decoratedText.getContent() + "</b>";
    }
}

// 具体装饰器:斜体
class ItalicDecorator extends TextDecorator {
    public ItalicDecorator(Text decoratedText) {
        super(decoratedText);
    }

    @Override
    public String getContent() {
        return "<i>" + decoratedText.getContent() + "</i>";
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Text simpleText = new SimpleText("Hello, World!");

        Text boldText = new BoldDecorator(simpleText);
        Text italicText = new ItalicDecorator(boldText);

        System.out.println(italicText.getContent());  // 输出:<i><b>Hello, World!</b></i>
    }
}

优点

  • 灵活性:可以按需组合装饰,增加或减少功能。
  • 遵循单一职责原则:每个装饰器负责一项功能。

缺点

  • 复杂性:增加了系统的复杂性,使用过多装饰器可能导致代码难以理解。
  • 性能问题:由于多层装饰,可能会引入一些性能开销。

希望这个介绍和示例对你理解装饰器模式有所帮助!如果你有任何问题,欢迎随时问我。

示例2 在线购物系统中的订单处理示例

一个在线购物系统中的订单处理示例。在这个例子中,我们将通过装饰器模式动态添加不同的费用,比如运费和税费。

结构

  1. 订单接口(Order):定义一个接口,表示订单的基本功能。
  2. 具体订单(BasicOrder):实现订单接口的基本订单。
  3. 装饰器(OrderDecorator):实现订单接口,持有一个订单的引用。
  4. 具体装饰器(ShippingDecorator, TaxDecorator):分别添加运费和税费。

示例代码

java 复制代码
// 订单接口
interface Order {
    double getCost();
}

// 具体订单
class BasicOrder implements Order {
    private double cost;

    public BasicOrder(double cost) {
        this.cost = cost;
    }

    @Override
    public double getCost() {
        return cost;
    }
}

// 装饰器
abstract class OrderDecorator implements Order {
    protected Order decoratedOrder;

    public OrderDecorator(Order decoratedOrder) {
        this.decoratedOrder = decoratedOrder;
    }

    @Override
    public double getCost() {
        return decoratedOrder.getCost();
    }
}

// 具体装饰器:运费
class ShippingDecorator extends OrderDecorator {
    private double shippingCost;

    public ShippingDecorator(Order decoratedOrder, double shippingCost) {
        super(decoratedOrder);
        this.shippingCost = shippingCost;
    }

    @Override
    public double getCost() {
        return decoratedOrder.getCost() + shippingCost;
    }
}

// 具体装饰器:税费
class TaxDecorator extends OrderDecorator {
    private double taxRate;

    public TaxDecorator(Order decoratedOrder, double taxRate) {
        super(decoratedOrder);
        this.taxRate = taxRate;
    }

    @Override
    public double getCost() {
        return decoratedOrder.getCost() + (decoratedOrder.getCost() * taxRate);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Order order = new BasicOrder(100.0);  // 基本订单

        // 添加运费
        order = new ShippingDecorator(order, 10.0);
        // 添加税费
        order = new TaxDecorator(order, 0.15);  // 15% 税率

        System.out.println("总费用: " + order.getCost());  // 输出:总费用: 126.5
    }
}

总结

在这个例子中,装饰器模式允许我们根据需要动态地为基本订单添加运费和税费,而无需修改基本订单的结构。这种灵活性在处理不同类型的订单时非常有用。如果你有其他问题或需要更深入的讨论,请告诉我!

相关推荐
qq_297574672 小时前
设计模式系列文章(基础篇第 11 篇):模板方法模式——定义算法骨架,实现代码复用与流程统一
算法·设计模式·模板方法模式
m0_535817553 小时前
macOS上Claude Code安装配置保姆级教程:国内直连API,从0到1跑通(附避坑指南)
gpt·macos·ai·node.js·claude·claudecode·88api
凯丨7 小时前
200 行 Python 训练一个 GPT:Karpathy 的极简主义 AI 教育实验
人工智能·python·gpt
狂人开飞机7 小时前
01. 工厂模式(Factory Pattern)
设计模式·c#
零壹AI实验室7 小时前
CSDN_微软Build_2026前瞻_自研编码模型能否撼动GPT-5_5与Claude_Opus_4_8
gpt·microsoft
superantwmhsxx8 小时前
GPT-5.5:面向下一代智能应用的技术展望
大数据·人工智能·gpt
阿狸猿8 小时前
论软件设计模式及其应用
设计模式
workflower9 小时前
具身智能-三层结构
人工智能·设计模式·动态规划·软件工程·scrum
我爱cope9 小时前
【Agent智能体10 | 反思设计模式-AI数据分析的可视化实战】
人工智能·设计模式·数据分析
老码观察9 小时前
设计模式实战解读(七):适配器模式——让不兼容的接口无缝协作
java·设计模式·适配器模式