设计模式16——行为型模式之解释器模式

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

类型:类行为型模式

概述:

          正如GoF所介绍的,解释器模式的应用场合比较窄。解释器模式在《Head First Design Pagtterns》中也被列为非常用模式。解释器模式虽然说更多应用在某种语言上,但是解释器的原理还是可以应用在其他场合的。

           解释器模式与组合模式有很大的相似性。正如GoF所言,在最宽泛的概念下,几乎每个使用复合模式的系统也都使用了解释器模式。解释器模式与组合模式的不同主要体现在,解释器模式中的几个解释器类都有相同的接口,而组合模式则是直接聚合几个没有关联的类。

          解释器模式虽说多用于某种解释语言上,但是其思想还是可以应用在其它方面的。解释器模式作为类行为模式,其主要是通过将一组平行操作的行为抽象出来作为独立的类存在。以达到降低类调用的耦合以及更方便地添加新的解释操作。这里举一个比较简单示例,有一段文字内容,需要用几个解释器来识别其中的地名,人名。

类图:

 

参与者:

  1. Client,构建Context,以及完成解释器的调用操作。
  2. Context,需要被解释的文件内容。
  3. Expression,抽象类,提供接口。
  1. NameExpressionAddressExpression,实现接口的具有解释操作。           

例代码:

 

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.   
  5. namespace Interpreter  
  6. {  
  7.     class Context  
  8.     {  
  9.         private string input;  
  10.         public string Input  
  11.         {  
  12.             get { return input; }  
  13.             set { input = value; }  
  14.         }  
  15.   
  16.         private string output;  
  17.         public string Output  
  18.         {  
  19.             get { return output; }  
  20.             set { output = value; }  
  21.         }  
  22.     }  
  23.   
  24.     abstract class AbstractExpression  
  25.     {  
  26.         public abstract void Interpret(Context context);  
  27.     }  
  28.   
  29.     class NameExpression : AbstractExpression  
  30.     {  
  31.         public override void Interpret(Context context)  
  32.         {  
  33.             Console.WriteLine("名字解释器");  
  34.         }  
  35.     }  
  36.   
  37.     class AddressExpression : AbstractExpression  
  38.     {  
  39.         public override void Interpret(Context context)  
  40.         {  
  41.             Console.WriteLine("地址解释器");  
  42.         }  
  43.     }  
  44.   
  45.     class Program  
  46.     {  
  47.         static void Main(string[] args)  
  48.         {  
  49.             Context context = new Context();  
  50.             IList<AbstractExpression> list = new List<AbstractExpression>();  
  51.             list.Add(new NameExpression());  
  52.             list.Add(new AddressExpression());  
  53.   
  54.             foreach (AbstractExpression exp in list)  
  55.             {  
  56.                 exp.Interpret(context);  
  57.             }  
  58.         }  
  59.     }  
  60. }  

 

适用性:

  1. 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。
  1. 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。

优缺点:

  1. 优点,能够灵活添加新的操作类。
  2. 缺点,使用范围过于狭窄。

参考资料:

  1. 《设计模式——可复用面向对象软件基础》
  2. 《大话设计模式》
  3. 《Head First设计模式》
原文地址:https://www.cnblogs.com/feihe0755/p/3556669.html