C# 设计模式之解释器模式
2018-02-18 20:58
2199 人阅读

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