定义:
解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
自己理解:
解释器顾名思义在一定的规则下解释东西,比如在战争时期用电报互通消息而不想让别人知道内容,就会先约定制成一个密码本作为载体,然后约定一些规则,这样如果你不知道'密码本'那么电报的内容你就不知道,这种传递消息的过程就是运用解释器模式,我觉得像各种各样的字典翻译也都算是解释器模式!(PS:纯属个人见解)
优缺点:
解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。而且在解释器中不同的规则是由不同的类来实现的,这样使得添加一个新的语法规则变得简单。
但是解释器模式对于复杂文法难以维护。可以想象一下,每一个规则要对应一个处理类,而且这些类还要递归调用抽象表达式角色,多如乱麻的类交织在一起是多么恐怖的一件事啊!
但是解释器模式对于复杂文法难以维护。可以想象一下,每一个规则要对应一个处理类,而且这些类还要递归调用抽象表达式角色,多如乱麻的类交织在一起是多么恐怖的一件事啊!
小例子:
书上的小例子——音乐解释器
代码实现:
//演奏内容
class PlayContext
{
//演奏文本
private string text;
public string PlayText
{
get { return text; }
set { text = value; }
}
}
abstract class Expression
{
//解释器
public void Interpret(PlayContext context)
{
if (context .PlayText .Length ==0)
{
return;
}
else
{
string playKey = context.PlayText.Substring(0,1);
context.PlayText = context.PlayText.Substring(2);
double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);
Excute(playKey ,playValue);
}
}
//执行
public abstract void Excute(string key, double value);
}
音符类:
//音符类
class Note:Expression
{
public override void Excute(string key, double value)
{
string note = "";
switch (key )
{
case "C":
note = "1";
break;
case "D":
note = "2";
break;
case "E":
note = "3";
break;
case "F":
note = "4";
break;
case "G":
note = "5";
break;
case "A":
note = "6";
break;
case "B":
note = "7";
break;
}
Console.Write("{0} ", note);
}
}
//音阶类
class Scale:Expression
{
public override void Excute(string key, double value)
{
string scale = "";
switch (Convert .ToInt32 (value ))
{
case 1:
scale = "低音";
break;
case 2:
scale = "中音";
break;
case 3:
scale = "高音";
break;
}
Console.Write("{0} ",scale );
}
}
客户端代码:
PlayContext context = new PlayContext();
//音乐-上海滩
Console.WriteLine("上海滩: ");
context.PlayText = "O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";
Expression expression = null;
try
{
while (context .PlayText .Length > 0)
{
string str = context.PlayText.Substring(0, 1)
;
switch (str )
{
case "O":
expression = new Scale();
break;
case "C":
case "D":
case "E":
case "F":
case "G":
case "A":
case "B":
case "P":
expression = new Note();
break;
}
expression.Interpret(context);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
运行结果:
错误:
但是我在实现的过程中遇到了小错误,其中客户端代码中有一行代码:
错误1:
context.PlayText = "O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3";
错误2:
context.PlayText = " O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";
结果:
分析原因:
其实当报这种错的时候我查了查原因第一个错误可能是:传递参数的过程中出现了错误 导致字符串没有包含,第二个出错的原因感觉解释的都不是太恰当,具体表现就是‘空格’。
总结:
在写代码的过程中还是要细心点儿,同时也因为这次的出错了解了错误和出错点儿,也算小有收获!