设计模式学习笔记--Interpeter解释模式

   Interpeter解释模式:给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 ——《设计模式》
   在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。此模式在实际应用中并不常见。
  Interpeter解释模式有以下角色:
  如图:
  


  1、Client客户程序:它是Interpreter模式的使用者,我们通常在此对Context进行初步分析,并形成一个表达式树(通常这个树保存在ArrayList中),这个树中的每一个节点表示要进行的操作(Terminal或NonTermianl类型的操作),这项工作通常打包在一个类中,在本例我们把它放在名为Parse的类中进行。 
  2、Context上下文:它就是我们要进行翻译解释的语句,是我们进行操作原材料。
  3、Expression抽象类:它是一个接口,TerminalExpression类与NonterminalExpression类均继承自此类,它定义了Interpret方法,并要求在其子类中实现此方法。
  4、TerminalExpression类: 它继承自Expression抽象类,它针对语句“分解”的功能成分比较少,主要是针对"最终原子"对象的处理。比如本例,对数学计算式分解后得到的整数的处理。
  5、NonterminalExpression类:它继承自Expression抽象类,它针对不同的语法情况需要定义不同的处理方式,所以通常我们需要在此处进行扩展,例如本例我们定义了针对"+"与"-"法的语法处理,如果需要用到"*"与"/",则我们也需要在此另外扩展相应的NonterminalExpression类。

   这里,我们就以一个数学计算式为例来进行说明:我们需要做的工作就是把左边的表达式翻译成右边的形式并加以计算,情况如下:
  "+ 7 8" 处理后 (7+8)=15
  "- 8 2" 处理后 (8-2)=6
  "+ - 3 8 6" 处理后 ((3-8)+6)=1
  "+ 2 - 7 6" 处理后  (2+(7-6))=3

   一、Interpreter模式流程示例 

Code
 在Client中展示流程
           #region 演示流程
             Console.WriteLine(
"-------Interpreter模式处理流程-------");
            Context context 
= new Context("the context");
            NonterminalExpression root 
= new NonterminalExpression();
            root.Expression1 
= new TerminalExpression();
            root.Expression2 
= new TerminalExpression();
            root.Interpret(context);
            Console.ReadKey();
            
#endregion

   二、数学计算式的Interpreter模式应用
  1、Context角色:此角色在实际应用中可有可没有,我们在这里并不需要它,但此处为完整,还是给出一个定义 

    public class Context
    {
        
public string Name { getset; }

        
public Context(string name)
        {
            Name 
= name;
        }
    }

  2、Expression抽象类角色

    #region 定义一个Expression接口
    
public abstract class ExpressionBase
    {
        
public abstract int Evaluate();
    }
    
#endregion

  3、TerminalExpression类角色 

Code

  4、NonterminalExpression类角色 

Code

  5、定义Parser,它负责对Context进行分解

Code

  6、Client客户程序角色

Code

  程序如下图:

                        
  运行效果如下图:

                        

总结:
Interpreter 模式的几个要点
1、Interpreter模式的应用场合是中的难点,只有满足Interpreter模式应用“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
2、使用Interpreter 模式来表示文法规则,从而可以使用面向对象技巧来方便地“扩展”文法。
3、Interpreter 模式比较适合简单的文法表示,对于复杂的文法表示,Interperter 模式会产生比较大的类层次结构,需要求助于语法分析生成器这样的标准工具。

 

 

前往:设计模式学习笔记清单
posted @ 2009-10-08 09:35  wsdj  阅读(1058)  评论(3编辑  收藏  举报