解释器模式(Interpreter Pattern)

    解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

    比如说,我们常常会在字符串中搜索匹配字符或判断一个字符串是否符合我们规定的格式,此时一般我们会用正则表达式匹配。解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。

    当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。

    解释器模式也有不足的,解释器模式为文法中的每一条规则至少定义了一个类,因此包含了许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其它的技术如语法分析程序或编译器生成器来处理。

    实例

    演奏内容类(context)

    表达式类(AbstractExpression)

    1. {
    2. //解释器
    3. public void Interpret(PlayContext context)
    4. {
    5. if (context.PlayText.Length == 0)
    6. {
    7. return;
    8. }
    9. else
    10. {
    11. //此方法用于将当前演奏文本第一条命令获得命令字母和其参数值。例如"O 3 E 0.5 G 0.5 A 3"则playKey为O而playValue为3
    12. string playKey = context.Playtext.subText.subString(0,1);
    13. context.PlayText = context. PlayText.subString(2);
    14. doublePlayValue = Convert.ToDouble(context.PlayText.SubString(0, context.PlayText.IndexOf("")));
    15. context.PlayText = context.PlayText.substring(context.PlayText.IndexOf("") + 1);
    16. }
    17. //执行
    18. public abstract void Excute(string key, doubel value);
    19. }

    音符类(TerminalExpression)

    1. class Scale: Expression
    2. {
    3. public override void Excute(string key, double value)
    4. {
    5. string scale = "";
    6. switch (Convert.ToInt32(value))
    7. {
    8. case 1:
    9. scale = "低音";
    10. break;
    11. case 2:
    12. scale = "中音";
    13. break;
    14. case 3:
    15. scale = "高音";
    16. }
    17. Console.Write("{0}",scale);
    18. }
    19. }

    客户端代码

    比如说 我现在要增加一个文法,就是演奏速度。

    1. class Speed :Expression
    2. {
    3. public override void Excute(string key, double value)
    4. {
    5. string speed;
    6. if (value < 500) {
    7. speed = "快速";
    8. } else if (value >= 1000)
    9. {
    10. speed = "慢速";
    11. } else {
    12. speed = "快速";
    13. }
    14. Console.Write("{0}",speed);
    15. }

    客户端代码(局部)