在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。
interface IExpression
{
void Interpret(StringBuilder sb);
}
public class WordExpression : IExpression
{
public string Value { get; set; }
public WordExpression(string _value)
{
this.Value = _value;
}
public void Interpret(StringBuilder sb)
{
sb.Append(ChineseEnglishDict.GetEnlish(Value.ToLower()));
}
}
public class SymbolExpression : IExpression
{
public string Value { get; set; }
public SymbolExpression(string value)
{
this.Value = value;
}
public void Interpret(StringBuilder sb)
{
switch (Value)
{
case ".":
sb.Append("。");
break;
}
}
}
public static class Translator
{
public static string Translate(string scentense)
{
StringBuilder sb = new StringBuilder();
List<IExpression> list = new List<IExpression>();
string[] elements = scentense.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in elements)
{
string[] words = item.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
foreach (string w in words)
{
list.Add(new WordExpression(w));
}
list.Add(new SymbolExpression("."));
}
foreach (IExpression ie in list)
{
ie.Interpret(sb);
}
return sb.ToString();
}
}
class Program
{
static void Main(string[] args)
{
string englist = "This is an apple.";
string chinese = Translator.Translate(englist);
Console.WriteLine(chinese);
Console.Read();
}
}
优点:
解释器模式的优点
易于改变和扩展文法。
易于实现文法。
增加了新的解释表达式的方式。
缺点:
对于复杂文法难以维护。
执行效率较低。
应用场景很有限。
适用环境:
在以下情况下可以使用解释器模式:
可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
一些重复出现的问题可以用一种简单的语言来进行表达。
文法较为简单。
效率不是关键问题。