解释器模式(Interpreter)

1.    定义

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

2.      UML 类图

 

3.      结构代码

// Interpreter pattern -- Structural example

using System;

using System.Collections;

 

namespace DoFactory.GangOfFour.Interpreter.Structural

{

  /// <summary>

  /// MainApp startup class for Structural

  /// Interpreter Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    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();

    }

  }

 

  /// <summary>

  /// The 'Context' class

  /// </summary>

  class Context

  {

  }

 

  /// <summary>

  /// The 'AbstractExpression' abstract class

  /// </summary>

  abstract class AbstractExpression

  {

    public abstract void Interpret(Context context);

  }

 

  /// <summary>

  /// The 'TerminalExpression' class

  /// </summary>

  class TerminalExpression : AbstractExpression

  {

    public override void Interpret(Context context)

    {

      Console.WriteLine("Called Terminal.Interpret()");

    }

  }

 

  /// <summary>

  /// The 'NonterminalExpression' class

  /// </summary>

  class NonterminalExpression : AbstractExpression

  {

    public override void Interpret(Context context)

    {

      Console.WriteLine("Called Nonterminal.Interpret()");

    }

  }

}


Output
Called Terminal.Interpret()
Called Nonterminal.Interpret()
Called Terminal.Interpret()
Called Terminal.Interpret()

4.      实例代码

// Interpreter pattern -- Real World example

using System;

using System.Collections.Generic;

 

namespace DoFactory.GangOfFour.Interpreter.RealWorld

{

  /// <summary>

  /// MainApp startup class for Real-World

  /// Interpreter Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      string roman = "MCMXXVIII";

      Context context = new Context(roman);

 

      // Build the 'parse tree'

      List<Expression> tree = new List<Expression>();

      tree.Add(new ThousandExpression());

      tree.Add(new HundredExpression());

      tree.Add(new TenExpression());

      tree.Add(new OneExpression());

 

      // Interpret

      foreach (Expression exp in tree)

      {

        exp.Interpret(context);

      }

 

      Console.WriteLine("{0} = {1}",

        roman, context.Output);

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Context' class

  /// </summary>

  class Context

  {

    private string _input;

    private int _output;

 

    // Constructor

    public Context(string input)

    {

      this._input = input;

    }

 

    // Gets or sets input

    public string Input

    {

      get { return _input; }

      set { _input = value; }

    }

 

    // Gets or sets output

    public int Output

    {

      get { return _output; }

      set { _output = value; }

    }

  }

 

  /// <summary>

  /// The 'AbstractExpression' class

  /// </summary>

  abstract class Expression

  {

    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(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(1);

      }

 

      while (context.Input.StartsWith(One()))

      {

        context.Output += (1 * Multiplier());

        context.Input = context.Input.Substring(1);

      }

    }

 

    public abstract string One();

    public abstract string Four();

    public abstract string Five();

    public abstract string Nine();

    public abstract int Multiplier();

  }

 

  /// <summary>

  /// A 'TerminalExpression' class

  /// <remarks>

  /// Thousand checks for the Roman Numeral M

  /// </remarks>

  /// </summary>

  class ThousandExpression : Expression

  {

    public override string One() { return "M"; }

    public override string Four() { return " "; }

    public override string Five() { return " "; }

    public override string Nine() { return " "; }

    public override int Multiplier() { return 1000; }

  }

 

  /// <summary>

  /// A 'TerminalExpression' class

  /// <remarks>

  /// Hundred checks C, CD, D or CM

  /// </remarks>

  /// </summary>

  class HundredExpression : Expression

  {

    public override string One() { return "C"; }

    public override string Four() { return "CD"; }

    public override string Five() { return "D"; }

    public override string Nine() { return "CM"; }

    public override int Multiplier() { return 100; }

  }

 

  /// <summary>

  /// A 'TerminalExpression' class

  /// <remarks>

  /// Ten checks for X, XL, L and XC

  /// </remarks>

  /// </summary>

  class TenExpression : Expression

  {

    public override string One() { return "X"; }

    public override string Four() { return "XL"; }

    public override string Five() { return "L"; }

    public override string Nine() { return "XC"; }

    public override int Multiplier() { return 10; }

  }

 

  /// <summary>

  /// A 'TerminalExpression' class

  /// <remarks>

  /// One checks for I, II, III, IV, V, VI, VI, VII, VIII, IX

  /// </remarks>

  /// </summary>

  class OneExpression : Expression

  {

    public override string One() { return "I"; }

    public override string Four() { return "IV"; }

    public override string Five() { return "V"; }

    public override string Nine() { return "IX"; }

    public override int Multiplier() { return 1; }

  }

}


Output
MCMXXVIII = 1928

该文章来自:http://www.dofactory.com/Patterns/PatternInterpreter.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值