首页 > GoF23种设计模式之行为型模式之解释器模式

GoF23种设计模式之行为型模式之解释器模式

一、概述

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

二、适用性               

        当需要解释一种语言,并且可以将该语言中的句子表示为一个抽象语法树的时候。

1.该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。

2.效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。

三、参与者

1.AbstractExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。

2.TerminalExpression: 实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例。

3.NonterminalExpression:为文法中的非终结符实现解释(Interpret)操作。

4.Context:包含解释器之外的一些全局信息。

5.Client:构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。调用解释操作。

四、类图

五、示例

AbstractExpression

[java] view plaincopy
print?
  1. package cn.lynn.interpreter;  
  2.   
  3. public abstract class Language {  
  4.   
  5.     public abstract void interpret();  
  6.   
  7. }  
Expression
[java] view plaincopy
print?
  1. package cn.lynn.interpreter;  
  2.   
  3. public class English extends Language {  
  4.   
  5.     @Override  
  6.     public void interpret() {  
  7.         System.out.println("为网页添加英文解释器!");  
  8.     }  
  9.   
  10. }  
[java] view plaincopy
print?
  1. package cn.lynn.interpreter;  
  2.   
  3. public class Chinese extends Language {  
  4.   
  5.     @Override  
  6.     public void interpret() {  
  7.         System.out.println("为网页添加中文解释器!");  
  8.     }  
  9.   
  10. }  
Context

[java] view plaincopy
print?
  1. package cn.lynn.interpreter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class Page {  
  7.   
  8.     private String content;  
  9.   
  10.     private List list = new ArrayList();  
  11.   
  12.     public String getContent() {  
  13.         return content;  
  14.     }  
  15.   
  16.     public void setContent(String content) {  
  17.         this.content = content;  
  18.     }  
  19.   
  20.     public void addLanguage(Language lang) {  
  21.         list.add(lang);  
  22.     }  
  23.   
  24.     public List getLanguages() {  
  25.         return list;  
  26.     }  
  27. }  
Client
[java] view plaincopy
print?
  1. package cn.lynn.interpreter;  
  2.   
  3. public class Client {  
  4.   
  5.     public static void main(String[] args) {  
  6.         Page page = new Page();  
  7.         page.addLanguage(new English());  
  8.         page.addLanguage(new Chinese());  
  9.           
  10.         for (Language lang : page.getLanguages()) {  
  11.             lang.interpret();  
  12.         }  
  13.     }  
  14.   
  15. }  
Result
[java] view plaincopy
print?
  1. 为网页添加英文解释器!  
  2. 为网页添加中文解释器!  

转载于:https://www.cnblogs.com/huangwentian/p/7471487.html

更多相关:

  • 在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用json格式的配置文件,那么在.net core中该如何读取json文件呢?1、在Startup类中读取json配置文件1、使用Confi...

  •   1 public class FrameSubject extends JFrame {   2    3   …………..   4    5   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个   6    7   //java.util.Observerable对象了。   8    9   DateSub...

  • 本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client  1、运行WebApi项目  URL http://yourserver/swagger 然后...

  •   在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性.   ModelState 在ApiController中一个ModelState属性用来获取参数验证结果.   public abstract class ApiController : IHttpController,...

  • 1# 引用  C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.dll C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.Applicati...

  • 04.微博消息的语言检测 郑昀 201010 隶属于《02.数据解析》小节 大意是,封装Google语言检测ajax web service的接口,输入一段话,输出语言种类。这个方法是从RssMeme.com看来的,经测试效果还不错,可用于检测微博客消息的语言,如中文、日文、韩文等。但由于Google对过于频繁的请求会重置链接,所以提...