博主喝口茶,一毛也是爱

收缩

C# 设计模式之解释器模式

270 人阅读
分类:

解释器就是用来将一些复杂的信息内容解析为通俗易懂的内容。

比如下面有两个字符串:

【链接:www.mikeblog.cn|****|favicon.ico|****|博客林|****|技术论坛】

【小程序:news.baidu.com|****|code|****|小程序面膜大师|****|小程序内容】

咋一看就是一串文本,再看下字符格式

链接字符格式: 【链接:url|****|图片url|****|标题|****|内容】

小程序字符个数: 【小程序:图片url|****|小程序编码|****|小程序名|****|文字内容】

现在我们知道上面的字符代表的意义了,只要解析字符就可以得到相应的值

下面使用解析器模式来得到两种格式的标题信息

定义上下文类

Content.cs

public class Content
{
    public string Text { get; set; }
    public Content(string text)
    {
        this.Text = text;
    }
    public string Get()
    {
        return this.Text;
    }
    public void Set(string text)
    {
        this.Text = text;
    }
}

定义个抽象类 

BaseInterpreter.cs

public abstract class BaseInterpreter
{
    public abstract void Conversion(Content content);
}

链接解释器 

LinkInterpreter.cs

public class LinkInterpreter : BaseInterpreter
{
    public override void Conversion(Content content)
    {
        //【链接:url|****|图片url|****|标题|****|内容|****|文字内容】
        if (content.Text.IndexOf("【链接:") == 0)
        {
            content.Text = content.Text.Replace("【链接:", "").Replace("】", "");

            string[] contentSplit = content.Text.Split(new string[] { "|****|" }, StringSplitOptions.RemoveEmptyEntries);
            if (contentSplit.Length == 4)
            {
                //获取标题
                content.Set(contentSplit[2]);
            }
        }
    }
}

小程序解释器

XCXInterpreter.cs

public class XCXInterpreter : BaseInterpreter
{
    public override void Conversion(Content content)
    {
        //【小程序:图片url|****|小程序编码|****|小程序名|****|文字内容】
        if (content.Text.IndexOf("【小程序:") == 0)
        {
            content.Text = content.Text.Replace("【小程序:", "").Replace("】", "");

            string[] contentSplit = content.Text.Split(new string[] { "|****|" }, StringSplitOptions.RemoveEmptyEntries);
            if (contentSplit.Length == 4)
            {
                content.Set(contentSplit[2]);
            }
        }
    }
}

客户端调用解释器代码

static void Main(string[] args)
{
    //链接字符格式: 【链接:url|****|图片url|****|标题|****|内容】
    //小程序字符个数: 【小程序:图片url|****|小程序编码|****|小程序名|****|文字内容】
    List<string> list = new List<string>() { };
    list.Add("【链接:www.mikeblog.cn|****|favicon.ico|****|博客林|****|技术论坛】");
    list.Add("【小程序:news.baidu.com|****|code|****|小程序面膜大师|****|小程序内容】");
    list.Add("【链接:www.baidu.com|****|bd_logo1.png|****|百度一下|****|百度】");

    foreach (string text in list)
    {
        Content content = new Content(text);
        List<BaseInterpreter> baseInterpreter = new List<BaseInterpreter>()
        {
            new LinkInterpreter(),
            new XCXInterpreter()
        };
        //使用解析器 解析出文字中的标题
        foreach (BaseInterpreter item in baseInterpreter)
        {
            item.Conversion(content);
        }

        Console.WriteLine("标题: " + content.Get());
    }


    Console.ReadKey();
}

1.jpg

使用解释器模式的好处:

易于扩展,如果增加个新的解析规则,只需要添加一个新的解析类,客户端只需要添加新的实例化

但也有坏处,如果解析规则太多,会造成解析类非常多,难以维护,所以比较适用于解析规则较固定的情况



和博主交个朋友吧
    发布篇幅
    • 文章总数:0
    • 原创:0
    • 转载:0
    • 译文:0
    文章分类
      文章存档
      阅读排行