您的位置:首页 > 其它

十八.行为型设计模式——Interpreter Pattern(解释器模式)

2011-09-20 00:20 561 查看

定义

  给出一种语言,定义这种语言的文法的一种表示,定义一个解释器,用它来解释使用这种语言的句子。

  UML类图如下:

  View Code

class Context
{
private string input;
private int output;

public Context(string input)
{
this.input = input;
}

public string Input
{
get { return input; }
set { input = value; }
}

public int Output
{
get { return output; }
set { output = value; }
}
}

//抽象表达式类
abstract class Expression
{
public abstract string One();
public abstract string Four();
public abstract string Five();
public abstract string Nine();
public abstract int Multiplier();
public void Interpret(Context context)
{
if (context.Input.Length == 0)
return;
if (context.Input.StartsWith(Nine()))
{
context.Output += 9 * Multiplier();
context.Input = context.Input.Substring(2);
}
else if (context.Input.StartsWith(Nine()))
{
context.Output += 9 * Multiplier();
context.Input = context.Input.Substring(2);
}
else if (context.Input.StartsWith(Four()))
{
context.Output += 4 * Multiplier();
context.Input = context.Input.Substring(2);
}
else if (context.Input.StartsWith(Five()))
{
context.Output += 5 * Multiplier();
context.Input = context.Input.Substring(2);
}
else if (context.Input.StartsWith(One()))
{
context.Output += 1 * Multiplier();
context.Input = context.Input.Substring(2);
}
}
}

//核对千位上的文字
class ThousandExpression : Expression
{
public override string One() { return "壹仟"; }
public override string Four() { return "肆仟"; }
public override string Five() { return "伍仟"; }
public override string Nine() { return "玖仟"; }
public override int Multiplier() { return 1000; }
}

//核对百位上的文字
class HundredExpression : Expression
{
public override string One() { return "壹百"; }
public override string Four() { return "肆百"; }
public override string Five() { return "伍百"; }
public override string Nine() { return "玖百"; }
public override int Multiplier() { return 100; }
}

//核对十位上的文字
class TenExpression : Expression
{
public override string One() { return "壹拾"; }
public override string Four() { return "肆拾"; }
public override string Five() { return "伍拾"; }
public override string Nine() { return "玖拾"; }
public override int Multiplier() { return 10; }
}

//核对个位上的文字
class OneExpression : Expression
{
public override string One() { return "壹圆"; }
public override string Four() { return "肆圆"; }
public override string Five() { return "伍圆"; }
public override string Nine() { return "玖圆"; }
public override int Multiplier() { return 1; }
}

class Program
{
static void Main(string[] args)
{
string chinese = "壹仟伍百玖拾伍圆";
Context context = new Context(chinese);
ArrayList parse = new ArrayList();
parse.Add(new ThousandExpression());
parse.Add(new HundredExpression());
parse.Add(new TenExpression());
parse.Add(new OneExpression());

foreach (Expression exp in parse)
{
exp.Interpret(context);
}

Console.Write("{0} = {1}", chinese, context.Output);
Console.Read();
}
}


优势和缺陷:

  解释器模式的作用很强大,它使得改变和扩展文法变得容易,实现文法也变得简单明了,很多编译器,包括文本编辑器、网页浏览器及VRML都应用解释器模式。

  解释器模式的缺陷就是,因为文句会分析成树结构,解释器需要递归访问它,所以效率会受影响。这种情况开发人员会有所体会,编译整个工程源码耗费时间都比较长。

应用情景:

  下面的情景很适合应用解释器模式:

  1.语言的文法需要扩展。

  2.程序效率不太重要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: