装饰者模式

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

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

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

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



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864