×

装饰者模式

勇哥,很想停止 勇哥,很想停止 发表于2023-11-30 16:41:19 浏览1443 评论0

抢沙发发表评论

装饰者模式是一种设计模式,用于动态地给一个对象添加一些额外的职责或行为。它允许你在不改变对象自身的基础上,增强其功能。装饰者模式通常用于实现与原有对象具有相同接口的新对象,并在新对象中添加额外的功能。

举个例子,假设我们有一个简单的文本处理程序,可以对文本进行加粗、斜体等操作。我们可以使用装饰者模式来动态地为这些操作添加额外的功能,比如记录日志或统计字符数。

下面是一个使用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"。

最后,执行了基础组件SimpleTextProcessorProcess方法,

返回了"Simple processing: Hello, world!"。

所以最终的输出结果是这三部分内容的组合。



群贤毕至

访客