装饰器模式(Decorator Pattern)

发布于:2025-06-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给对象添加新的功能,而不改变其原有的结构。这种类型的设计模式创建了一个装饰类,用来包装原有的类,从而在不修改原有对象的情况下扩展其功能。

体现的设计原则

  1. 单一职责原则:每个装饰器只负责一个特定的功能扩展,使得代码更易于维护和复用。
  2. 开闭原则:可以在不修改现有代码的情况下通过创建新的装饰器来扩展功能。
  3. 组合优于继承:通过组合而不是继承来增加功能,避免了子类数量的爆炸式增长。

示例场景

假设我们在开发一个文本编辑器,基础功能是显示纯文本,但我们希望能够在不影响现有功能的情况下,逐步增加如加粗、斜体等格式化功能。

Java 代码示例

// 抽象组件 - 文本接口
interface Text {
    void display();
}

// 具体组件 - 简单文本
class SimpleText implements Text {
    private String content;

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

    @Override
    public void display() {
        System.out.print(content);
    }
}

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

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

    @Override
    public void display() {
        decoratedText.display();
    }
}

// 具体装饰器 - 加粗文本
class BoldTextDecorator extends TextDecorator {
    public BoldTextDecorator(Text decoratedText) {
        super(decoratedText);
    }

    @Override
    public void display() {
        System.out.print("<b>");
        super.display();
        System.out.print("</b>");
    }
}

// 具体装饰器 - 斜体文本
class ItalicTextDecorator extends TextDecorator {
    public ItalicTextDecorator(Text decoratedText) {
        super(decoratedText);
    }

    @Override
    public void display() {
        System.out.print("<i>");
        super.display();
        System.out.print("</i>");
    }
}

// 客户端代码
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        // 创建简单文本
        Text simpleText = new SimpleText("Hello, world!");

        // 使用加粗装饰器
        Text boldText = new BoldTextDecorator(simpleText);
        boldText.display();
        System.out.println();

        // 使用斜体装饰器
        Text italicText = new ItalicTextDecorator(simpleText);
        italicText.display();
        System.out.println();

        // 组合使用加粗和斜体装饰器
        Text boldItalicText = new BoldTextDecorator(new ItalicTextDecorator(simpleText));
        boldItalicText.display();
        System.out.println();
    }
}

在这个例子中:

  • Text 是抽象组件接口,定义了所有具体组件和装饰器共有的方法 display
  • SimpleText 是具体组件类,实现了 Text 接口并提供基本的文本显示功能。
  • TextDecorator 是抽象装饰器类,持有一个 Text 对象的引用,并实现了 Text 接口,以便将请求委托给被装饰的对象。
  • BoldTextDecoratorItalicTextDecorator 是具体装饰器类,分别用于添加加粗和斜体功能。
  • 在客户端代码中,可以通过组合不同的装饰器来动态地添加功能。

这样,我们可以在不修改原有对象的情况下,通过装饰器来灵活地扩展对象的功能。