设计模式总结:装饰者模式
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象结构的情况下,为对象动态添加新的功能。这个模式通过创建一个装饰类来包装原始类,从而在不修改现有类代码的情况下,扩展对象的功能。
关键组成部分
组件接口(Component):
- 定义了被装饰类和装饰者类共有的方法。
具体组件(ConcreteComponent):
- 实现了组件接口的类。被装饰者,它是被装饰者模式动态添加行为和功能的目标。
装饰抽象类(Decorator):
- 持有一个指向组件接口的引用(一般为私有)。它自身也实现了组件接口,目的在于保证装饰者和被装饰者的接口一致。
具体装饰者(ConcreteDecorator):
- 继承自装饰抽象类,并且可以向其中添加额外的行为或职责。
工作原理
- 原始类和装饰类都实现相同的接口或继承同一抽象类。
- 装饰类通过持有一个接口对象的引用,将新行为附加到该对象上。
- 客户端代码仍然以原始类的引用来工作,而不需要关心对象是原始的还是经过装饰的。
优点
- 灵活性:可以在运行时选择不同的装饰器进行组合。
- 符合开闭原则:不需要修改已有代码,就可以增加新的功能。
- 细粒度控制:允许通过多个不同的装饰器对象,对对象添加不同的行为或属性。
缺点
- 可能增加程序复杂性:如果装饰类过多,系统将变得更加复杂。
- 调试困难:由于装饰者模式存在多层装饰器,调试时可能需要逐步查找问题源。
示例
假设我们有一个简单的文本输出器,我们希望能够在输出文本的基础上添加不同的行为,比如:加密、压缩等。实现如下:
// 组件接口
interface TextOutput {
String format();
}
// 具体组件
class SimpleTextOutput implements TextOutput {
private String text;
public SimpleTextOutput(String text) {
this.text = text;
}
@Override
public String format() {
return text;
}
}
// 装饰抽象类
abstract class TextOutputDecorator implements TextOutput {
protected TextOutput decoratedOutput;
public TextOutputDecorator(TextOutput decoratedOutput) {
this.decoratedOutput = decoratedOutput;
}
@Override
public String format() {
return decoratedOutput.format();
}
}
// 具体装饰者
class EncryptedTextOutput extends TextOutputDecorator {
public EncryptedTextOutput(TextOutput decoratedOutput) {
super(decoratedOutput);
}
@Override
public String format() {
return encrypt(decoratedOutput.format());
}
private String encrypt(String data) {
// 简单加密处理(反转字符串)
return new StringBuilder(data).reverse().toString();
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
TextOutput myText = new SimpleTextOutput("Hello, Decorator Pattern!");
TextOutput encryptedText = new EncryptedTextOutput(myText);
System.out.println("Original: " + myText.format());
System.out.println("Encrypted: " + encryptedText.format());
}
}
在这个示例中,SimpleTextOutput
是原始类,而EncryptedTextOutput
是为其添加了加密行为的装饰者类。通过这种设计,我们可以轻松添加其他的装饰者,比如压缩功能。