C#设计模式——解释器模式(Interpreter Pattern)
一、概述
在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂的业务语言进行翻译。这种做法虽然效率相对较低,但可以允许用户使用自定义的业务语言来处理逻辑,因此在效率不是关键问题的场合还是较为有用的。
二、解释器模式
解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。其结构图如下:

AbstractExpression声明一个为抽象语法树中所有节点所共享的解释接口。
TerminalExpression表示终结符表达式,实现文法中终结符相关联的所有解释操作。
NonterminalExpression表示非终结符表达式,实现文法中所有非终结符的解释操作。
Context包含解释器外的一些全局信息。
Client构建语法树并调用解释器。
三、示例
我们我们就以中英文翻译系统为例来介绍解释器模式。
中英文对照字典如下。
public static class ChineseEnglishDict
{
private static Dictionary<string, string> _dictory = new Dictionary<string, string>(); static ChineseEnglishDict()
{
_dictory.Add("this", "这");
_dictory.Add("is", "是");
_dictory.Add("an", "一个");
_dictory.Add("apple", "苹果");
} public static string GetEnglish(string value)
{
return _dictory[value];
}
}
首先定义AbstractExpression接口。
public interface IExpression
{
void Interpret(StringBuilder sb);
}
接着定义具体的Expression,这里包括对英文单词的翻译和对英文句号的翻译。
public class WordExpression : IExpression
{
private string _value; public WordExpression(string value)
{
_value = value;
} public void Interpret(StringBuilder sb)
{
sb.Append(ChineseEnglishDict.GetEnglish(_value.ToLower()));
}
} public class SymbolExpression : IExpression
{
private string _value; public SymbolExpression(string value)
{
_value = value;
} public void Interpret(StringBuilder sb)
{
switch (_value)
{
case "." :
sb.Append("。");
break;
}
}
}
最后将各部分解释器组合起来进行包装,方便用户调用。
public static class Translator
{
public static string Translate(string sentense)
{
StringBuilder sb = new StringBuilder();
List<IExpression> expressions = new List<IExpression>();
string [] elements = sentense.Split(new char [] {'.'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string element in elements)
{
string[] words = element.Split(new char [] {' '}, StringSplitOptions.RemoveEmptyEntries);
foreach (string word in words)
{
expressions.Add(new WordExpression(word));
}
expressions.Add(new SymbolExpression("."));
}
foreach (IExpression expression in expressions)
{
expression.Interpret(sb);
}
return sb.ToString();
}
}
让我们来看一下如何调用解释器。
static void Main(string[] args)
{
string englist = "This is an apple.";
string chinese = Translator.Translate(englist);
Console.WriteLine(chinese);
}
C#设计模式——解释器模式(Interpreter Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...
- C#设计模式:解释器模式(Interpreter Pattern)
一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...
- 二十四种设计模式:解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...
- javascript设计模式 - 解释器模式(interpreter)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 大话设计模式--解释器模式 interpreter -- C++实现实例
1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...
- 原始的解释器模式(Interpreter Pattern)
解释器模式的定义(现实项目中非常少遇到,因此直接理论先...) 解释器模式是一种依照规定语法进行解析的方案,在如今项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解 ...
- php解释器模式( interpreter pattern)
... <?php /* The interpreter pattern specifies how to evaluate language grammar or expressions. W ...
- 设计模式:解释器模式(Interpreter)
为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...
- 十一个行为模式之解释器模式(Interpreter Pattern)
定义: 定义一个语言的文法,可以使用一个解释器来解释其文法.定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联. 结构图: AbstractExpression:抽象表达式类, ...
随机推荐
- Java实验五
20145113 Java实验五 网络编程及安全 实验内容 对于客户端与服务器端:修改原代码,使其可以实现连续的传消息,并且传送文件. 对于加解密部分: 对于原先的加密只加密"hello w ...
- UVa 10410树重建
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- HA-0302 退役
2016年11月20日 上午12:00许,NOIP2016(复赛)结束. HA-0302正式退役.
- Unity全视角游戏的键盘操作位移——研究笔记
using UnityEngine; using System.Collections; public class MoveCeShi : MonoBehaviour { ; private Char ...
- mock测试到底是什么?
经常听人说mock测试,究竟什么是mock测试呢?mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍,之后会有详细的mock测试,感谢大家对测试梦工厂的持续关注. 概 ...
- 分析案例:应用服务器W3WP进程CPU持续超过百分之九十(Oracle客户端Bug)
问题描述: 项目反馈应用负载的其中一台服务器业务操作的响应非常慢,登录该服务器发现W3WP进程CPU持续超过90%,哪怕在业务低峰期也是如此?远程查看后发现该应用服务器承载的请求确实很低,why??? ...
- GraphicsMagick+Im4Java在windows和linux下的配置
GraphicsMagick介绍及安装 Im4Java包为: im4java-1.2.0.jar 直接在lib下引用即可 GraphicsMagick的安装如下: windows下: 安装:Graph ...
- 手机网页调试利器: Chrome
新开发的网页需要在手机或是模拟机上运行测试, 可以借助 Chrome提供的手机网页预览程序进行简单调试.查看 制作的网页是否能够适合各种手机型号使用. 下面所以下如何使用Chrome调试多类型手机网页 ...
- 自定义 Activity 的 标题栏 TitleBar
自定义 Activity 的 标题栏 TitleBar 1. 修改标题栏的高度,背景 编辑styles.xml,添加: <?xmlversion="1.0" encoding ...
- mysql 5.7.11 yum 安装步骤
直接上步骤 首先你得有一台能够上外网的linux服务器 1:rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch ...