一,C#设计模式:解释器模式(Interpreter Pattern)

1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用解释器模式
2,解释器设计模式每个解释的类有自己的规则,并且与其他业务规则不冲突

二,如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _23.解释器模式
{
/// <summary>
/// Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
/// 1、当一个语言需要解释执行,并可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式(如XML文档解释、正则表达式等领域)
/// 2、一些重复出现的问题可以用一种简单的语言来进行表达。
/// 3、一个语言的文法较为简单.
/// 4、当执行效率不是关键和主要关心的问题时可考虑解释器模式(注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。)
/// </summary>
class Program
{
static void Main(string[] args)
{
Context context = new Context("usachi");
List<PeopleInterpreter> interpreterList = new List<PeopleInterpreter>()
{
new Chinese(),
new Usa(),
};
foreach (var item in interpreterList)
{
item.Conversion(context);
}
Console.WriteLine(context.Get());
}
} /// <summary>
/// 上下文
/// </summary>
public class Context
{
private string _Word = null;
public Context(string word)
{
this._Word = word;
} public void Set(string newWord)
{
this._Word = newWord;
} public string Get()
{
return this._Word;
}
} /// <summary>
/// 抽象解释器
/// </summary>
public abstract class PeopleInterpreter
{
public abstract void Conversion(Context context);
}
/// <summary>
/// 中国人业务
/// </summary>
public class Chinese : PeopleInterpreter
{
private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>();
/// <summary>
/// 中国人自己解释规则
/// </summary>
static Chinese()
{
_Dictionary.Add('c', "中国人");
_Dictionary.Add('h', "用");
_Dictionary.Add('i', "筷子吃饭");
}
/// <summary>
/// 中国人解释输入的文案
/// 然后返回解释的文案
/// </summary>
/// <param name="context"></param>
public override void Conversion(Context context)
{
Console.WriteLine(this.GetType().ToString() + "业务");
string text = context.Get();
if (string.IsNullOrEmpty(text))
return;
List<string> numberList = new List<string>();
foreach (var item in text.ToLower().ToArray())
{
if (_Dictionary.ContainsKey(item))
{
numberList.Add(_Dictionary[item]);
}
else
{
numberList.Add(item.ToString());
}
}
context.Set(string.Concat(numberList));
}
}
/// <summary>
/// 美国人业务
/// </summary>
public class Usa : PeopleInterpreter
{
private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>();
/// <summary>
/// 美国人自己解释规则
/// </summary>
static Usa()
{
_Dictionary.Add('u', "美国人");
_Dictionary.Add('s', "用刀叉");
_Dictionary.Add('a', "吃饭,");
} /// <summary>
/// 美国人解释输入的文案
/// 然后返回解释的文案
/// </summary>
/// <param name="context"></param>
public override void Conversion(Context context)
{
Console.WriteLine(this.GetType().ToString() + "业务");
string text = context.Get();
if (string.IsNullOrEmpty(text))
return;
List<string> numberList = new List<string>();
foreach (var item in text.ToLower().ToArray())
{
if (_Dictionary.ContainsKey(item))
{
numberList.Add(_Dictionary[item]);
}
else
{
numberList.Add(item.ToString());
}
}
context.Set(string.Concat(numberList));
}
}
}

C#设计模式:解释器模式(Interpreter Pattern)的更多相关文章

  1. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  2. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  3. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  4. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  6. 原始的解释器模式(Interpreter Pattern)

    解释器模式的定义(现实项目中非常少遇到,因此直接理论先...) 解释器模式是一种依照规定语法进行解析的方案,在如今项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解 ...

  7. php解释器模式( interpreter pattern)

    ... <?php /* The interpreter pattern specifies how to evaluate language grammar or expressions. W ...

  8. 设计模式:解释器模式(Interpreter)

    为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...

  9. 十一个行为模式之解释器模式(Interpreter Pattern)

    定义: 定义一个语言的文法,可以使用一个解释器来解释其文法.定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联. 结构图: AbstractExpression:抽象表达式类, ...

随机推荐

  1. 那些10w+的公众号都在写什么?

    出于好奇,那些10w+的公众号都写了些什么,于是我写了几个脚本爬取了各行业Top的公众号文章,进行了关键词统计. 抓取数据.分析用到了3中语言:Node.js,Java,Python.废话不多说,直接 ...

  2. docker-compose进行部署容器的时候,报错权限不足

    刚刚用docker-compose部署elk的时候,没有起来,查看日志的时候,发现在数据卷挂载的时候,报错权限不足. 由于日志不在了,这里就直接贴出解决办法. 问题原因及解决办法 原因是CentOS7 ...

  3. Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越来越多的分析函数,用于完成负责的统计分析.抽时间将所有的分析窗 ...

  4. [BZOJ3990]:[SDOI2015]排序(搜索)

    题目传送门 题目描述 小A有一个1-${2}^{N}$的排列A[1..${2}^{N}$],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1≤i≤N), ...

  5. activemq 笔记

    官网下载好后,修改下conf下activemq.xml配置文件就可以了. 主要将这里的ip改成我们这里用的locahost就可以了: <transportConnectors> <! ...

  6. 移动Anaconda安装目录后导致图标变白以及Anaconda Navigator,Anaconda Prompt,jupyter notebook和spyder启动不了的解决方法

    Q:因为移动了Anaconda3的安装目录,所以Anaconda3的相应应用程序启动不了,包括图标也会变白 解决方法:修改对应快捷键的属性,有对应的启动位置,修改下位置路径配置以及图标(Anacond ...

  7. [论文理解] Squeeze-and-Excitation Networks

    Squeeze-and-Excitation Networks 简介 SENet提出了一种更好的特征表示结构,通过支路结构学习作用到input上更好的表示feature.结构上是使用一个支路去学习如何 ...

  8. Linux(Ubuntu)常用命令 & vim基本操作

    Linux先知: Linux历史: 关于这个我就不再多说了,其实是一个很有意思的故事串,网上找下一大堆. 类Unix系统目录结构: ubuntu没有盘符这个概念,只有一个根目录/,所有文件都在它下面 ...

  9. cocos2dx基础篇(16) 基本绘图DrawPrimitives

    [3.x] (1)去掉前缀 "cc" (2)将 ccDraw***() 封装到了 DrawPrimitives 命名空间中. (3)重写绘图函数:         draw(Ren ...

  10. 初学node.js-nodejs中实现修改用户路由

    经过前面几次的学习,已经可以做下小功能,今天要实现的是修改用户路由. 一.users_model.js  功能:定义用户对象模型 var mongoose=require('mongoose'), S ...