# 解释器模式

属于行为型模式。
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

适用性:

  • 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
  • 当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。
  • 易扩展,易于实现简单文法。
  • 对于复杂的文法比较难维护和管理。当文法非常复杂时建议使用其他的技术(语法分析程序或编译生成器)

# 类图

img

# 代码

# 解释器

namespace BehavioralPatterns_InterpreterPattern
{
    /// <summary>
    /// 抽象解释器
    /// </summary>
    public abstract class Expression
    {
        /// <summary>
        /// 解释
        /// </summary>
        /// <param name="content"></param>
        public abstract void Interpret(ref string content);
    }
}
namespace BehavioralPatterns_InterpreterPattern
{
    /// <summary>
    /// 终结符表达式
    /// 规定:';' 是终结符
    /// </summary>
    public class TerminalExpression : Expression
    {
        public override void Interpret(ref string content)
        {
            content = content.Replace(';', ' ');
        }
    }
}
namespace BehavioralPatterns_InterpreterPattern
{
    /// <summary>
    /// 非终结符表达式
    /// </summary>
    public class NonterminalExpression : Expression
    {
        public override void Interpret(ref string content)
        {
            content = content.ToUpper();
        }
    }
}

# 测试

namespace BehavioralPatterns_InterpreterPattern
{
    public class Program
    {
        private static void Main()
        {
            Expression terminalExpression = new TerminalExpression();
            Expression nonterminalExpression = new NonterminalExpression();
            string content = "a;b;c";
            terminalExpression.Interpret(ref content);
            nonterminalExpression.Interpret(ref content);
            Console.WriteLine(content);
        }
    }
}

运行结果:
A B C