C# 设计模式之解释器模式
2018-02-18 20:58
2889 人阅读
解释器就是用来将一些复杂的信息内容解析为通俗易懂的内容。
比如下面有两个字符串:
【链接: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();
}
使用解释器模式的好处:
易于扩展,如果增加个新的解析规则,只需要添加一个新的解析类,客户端只需要添加新的实例化
但也有坏处,如果解析规则太多,会造成解析类非常多,难以维护,所以比较适用于解析规则较固定的情况
和博主交个朋友吧