zoukankan      html  css  js  c++  java
  • GoF23种设计模式之行为型模式之解释器模式

    一、概述

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

    二、适用性               

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

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

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

    三、参与者

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

    四、类图

    五、示例

    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. 为网页添加中文解释器!  
     
     
  • 相关阅读:
    延时显示(类QQ头像显示)
    getComputedStyle与currentStyle获取样式(style/class)
    私单
    厂里
    009 vue的响应式方法
    008 vue的v-for的使用及key的使用
    007 v-if,v-else-if,v-else和v-show
    006 Vue的v-on
    005 Vue 计算属性
    004 Vue的v-bind属性
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471487.html
Copyright © 2011-2022 走看看