装饰者模式是一种设计模式,用于动态地给一个对象添加一些额外的职责或行为。它允许你在不改变对象自身的基础上,增强其功能。装饰者模式通常用于实现与原有对象具有相同接口的新对象,并在新对象中添加额外的功能。
举个例子,假设我们有一个简单的文本处理程序,可以对文本进行加粗、斜体等操作。我们可以使用装饰者模式来动态地为这些操作添加额外的功能,比如记录日志或统计字符数。
下面是一个使用C#实现装饰者模式的例子:
using System; namespace DecoratorPatternExample { // 基础接口,定义需要实现的方法 public interface ITextProcessor { string Process(string input); } // 具体组件,实现基础接口 public class SimpleTextProcessor : ITextProcessor { public string Process(string input) { return $"Simple processing: {input}"; } } // 装饰者抽象类,继承自基础接口,并持有一个组件对象 public abstract class TextProcessorDecorator : ITextProcessor { protected ITextProcessor _component; public TextProcessorDecorator(ITextProcessor component) { _component = component; } public virtual string Process(string input) { return _component.Process(input); } } // 具体装饰者A,添加额外的功能A(比如记录日志) public class LoggingTextProcessor : TextProcessorDecorator { public LoggingTextProcessor(ITextProcessor component) : base(component) { } public override string Process(string input) { Console.WriteLine("Logging: Processing text..."); return base.Process(input); } } // 具体装饰者B,添加额外的功能B(比如统计字符数) public class CharacterCountTextProcessor : TextProcessorDecorator { public CharacterCountTextProcessor(ITextProcessor component) : base(component) { } public override string Process(string input) { string result = base.Process(input); Console.WriteLine($"Character count: {result.Length}"); return result; } } }
使用示例:
class Program { static void Main(string[] args) { // 创建基础组件对象 ITextProcessor textProcessor = new SimpleTextProcessor(); // 添加记录日志功能的装饰者A textProcessor = new LoggingTextProcessor(textProcessor); // 添加统计字符数功能的装饰者B,可以一直叠加装饰者下去。 textProcessor = new CharacterCountTextProcessor(textProcessor); // 使用装饰后的对象进行处理并输出结果,可以看到输出结果中包含了各个装饰者添加的功能。 //输出结果: //Logging: Processing text... //Simple processing: Hello, world! //Character count: 23。 Console.WriteLine(textProcessor.Process("Hello, world!")); // 输出结果:Logging: Processing text... , //Simple processing: Hello, world! ,Character count: 23。 Console.ReadLine(); } }
执行上述C#代码后,输出结果如下:
Logging: Processing text... Character count: 23 Simple processing: Hello, world!
这个结果表明,我们首先执行了LoggingTextProcessor
装饰者,打印了"Logging: Processing text..."。然后执行了CharacterCountTextProcessor
装饰者,统计了处理后的文本字符数,并打印了"Character count: 23"。
最后,执行了基础组件SimpleTextProcessor
的Process
方法,
返回了"Simple processing: Hello, world!"。
所以最终的输出结果是这三部分内容的组合。

