十八.行为型设计模式——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.程序效率不太重要。
相关文章推荐
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式16——行为型模式之解释器模式
- 设计模式22---设计模式之解释器模式(Interpreter)(行为型)
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 解释器模式(Interpreter) - Java实现
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- “设计模式”学习之七:解释器与中介者(行为型)
- 设计模式16——行为型模式之解释器模式
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(一)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式(15)--Interpreter(解释器模式)--行为型
- 设计模式(行为型)之解释器模式(Interpreter Pattern)
- 设计模式(15)-行为型-解释器模式(Interpreter)
- [设计模式笔记]三. 行为型模式--17. Interpreter模式(解释器模式)(二)
- "围观"设计模式(27)--行为型之解释器模式(Interpreter Pattern)