装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给对象添加新的功能,而不改变其原有的结构。这种类型的设计模式创建了一个装饰类,用来包装原有的类,从而在不修改原有对象的情况下扩展其功能。
体现的设计原则
- 单一职责原则:每个装饰器只负责一个特定的功能扩展,使得代码更易于维护和复用。
- 开闭原则:可以在不修改现有代码的情况下通过创建新的装饰器来扩展功能。
- 组合优于继承:通过组合而不是继承来增加功能,避免了子类数量的爆炸式增长。
示例场景
假设我们在开发一个文本编辑器,基础功能是显示纯文本,但我们希望能够在不影响现有功能的情况下,逐步增加如加粗、斜体等格式化功能。
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
接口,以便将请求委托给被装饰的对象。BoldTextDecorator
和ItalicTextDecorator
是具体装饰器类,分别用于添加加粗和斜体功能。- 在客户端代码中,可以通过组合不同的装饰器来动态地添加功能。
这样,我们可以在不修改原有对象的情况下,通过装饰器来灵活地扩展对象的功能。