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

一、概述

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

二、适用性               

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

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

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

三、参与者

1.AbstractExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
2.TerminalExpression: 实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例。
3.NonterminalExpression:为文法中的非终结符实现解释(Interpret)操作。
4.Context:包含解释器之外的一些全局信息。
5.Client:构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。调用解释操作。

四、类图

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

五、示例

AbstractExpression

[java] view plain copy
 
 print?
  1. package cn.lynn.interpreter;  
  2.   
  3. public abstract class Language {  
  4.   
  5.     public abstract void interpret();  
  6.   
  7. }  
Expression
[java] view plain copy
 
 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 plain copy
 
 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 plain copy
 
 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<Language> list = new ArrayList<Language>();  
  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<Language> getLanguages() {  
  25.         return list;  
  26.     }  
  27. }  
Client
[java] view plain copy
 
 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 plain copy
 
 print?
  1. 为网页添加英文解释器!  
  2. 为网页添加中文解释器!