给定一种语言,并定义其语法,然后用解释器解释使用该语言中的句子。
使用频度:
低
UML 类图
参与者
该模式参与的类或对象
- TerminalExpression(终结符表达式,具体表达式ThousandExpression, HundredExpression, TenExpression, OneExpression )
- NonterminalExpression(非终端表达式)
- 语法中的每个规则R1:=R2R3...Rn都需要这样的类
- 从R1到Rn每个符号都要维护一个AbstractExpression类型的实例变量
- 实现非终端符号的解释操作,解释器一般要递归的调用表示从R1到Rn的解释操作
C# 示例代码 // Interpreter pattern -- Structural example
using System;
using System.Collections;
namespace DoFactory.GangOfFour.Interpreter.Structural
{
///
/// MainApp startup class for Structural
/// Interpreter Design Pattern.
///
class MainApp
{
///
/// Entry point into console application.
///
static void Main()
{
Context context = new Context();
// Usually a tree
ArrayList list = new ArrayList();
// Populate 'abstract syntax tree'
list.Add(new TerminalExpression());
list.Add(new NonterminalExpression());
list.Add(new TerminalExpression());
list.Add(new TerminalExpression());
// Interpret
foreach (AbstractExpression exp in list)
{
exp.Interpret(context);
}
// Wait for user
Console.ReadKey();
}
}
///
/// The 'Context' class
///
class Context
{
}
///
/// The 'AbstractExpression' abstract class
///
abstract class AbstractExpression
{
public abstract void Interpret(Context context);
}
///
/// The 'TerminalExpression' class
///
class TerminalExpression : AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("Called Terminal.Interpret()");
}
}
///
/// The 'NonterminalExpression' class
///
class NonterminalExpression : AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("Called Nonterminal.Interpret()");
}
}
}
|
输出
Called Terminal.Interpret()
Called Nonterminal.Interpret()
Called Terminal.Interpret()
Called Terminal.Interpret()
|
阅读(717) | 评论(0) | 转发(0) |