装饰者模式是一种设计模式,用于动态地给一个对象添加一些额外的职责或行为。它允许你在不改变对象自身的基础上,增强其功能。装饰者模式通常用于实现与原有对象具有相同接口的新对象,并在新对象中添加额外的功能。
举个例子,假设我们有一个简单的文本处理程序,可以对文本进行加粗、斜体等操作。我们可以使用装饰者模式来动态地为这些操作添加额外的功能,比如记录日志或统计字符数。
下面是一个使用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!"。
所以最终的输出结果是这三部分内容的组合。

