zoukankan      html  css  js  c++  java
  • 解释器模式

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

     优点:

    可以很容易的改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语言各个节点的类实现大体类似,这些类都易于直接编写。

    缺点:

    解释器模式为文法的每一条规则至少定义一个类,因此包含了很多条规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其它的技术如语法分析程序或编译器生成器来处理

    示例代码:

     1 public class Context {
     2     private String input;
     3     private String output;
     4     public String getInput() {
     5         return input;
     6     }
     7     public void setInput(String input) {
     8         this.input = input;
     9     }
    10     public String getOutput() {
    11         return output;
    12     }
    13     public void setOutput(String output) {
    14         this.output = output;
    15     }
    16     
    17 
    18 }
    Context
    1 public abstract class AbstractExpression {
    2     public abstract void interpret(Context context);
    3 }
    AbstractExpression
     1 public class TerminalExpression extends AbstractExpression{
     2 
     3     @Override
     4     public void interpret(Context context) {
     5         context.setOutput("啦啦啦"+context.getInput());
     6         System.out.println("终端解释器处理后=="+context.getOutput());
     7         
     8     }
     9 
    10 }
    TerminalExpression
     1 public class NonterminalExpression extends AbstractExpression {
     2 
     3     @Override
     4     public void interpret(Context context) {
     5         context.setOutput("嘟嘟啦"+context.getInput());
     6         System.out.println("非终端解释器处理后=="+context.getOutput());
     7         
     8     }
     9 
    10 }
    NonterminalExpression
     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class InterpreterTest {
     5     public static void main(String[] args) {
     6         Context con = new Context();
     7         con.setInput("卖报卖报。。。");
     8         List<AbstractExpression> list = new ArrayList<AbstractExpression>();
     9         list.add(new TerminalExpression());
    10         list.add(new TerminalExpression());
    11         list.add(new NonterminalExpression());
    12         list.add(new TerminalExpression());
    13         
    14         for (AbstractExpression abstractExpression : list) {
    15             abstractExpression.interpret(con);
    16         }
    17     }
    18 }
    test
    终端解释器处理后==啦啦啦卖报卖报。。。
    终端解释器处理后==啦啦啦卖报卖报。。。
    非终端解释器处理后==嘟嘟啦卖报卖报。。。
    终端解释器处理后==啦啦啦卖报卖报。。。
    测试打印
  • 相关阅读:
    MYSQL索引使用
    事务的概念是什么,有哪些基本属性?
    springboot和springmvc的区别
    List、Map、Set的区别与联系
    MyBatis-动态SQL
    MyBatis-映射文件
    MyBatis操作数据库及全局配置文件
    Jmeter的基本使用
    MySQL索引优化
    MySQL索引
  • 原文地址:https://www.cnblogs.com/cai170221/p/13404557.html
Copyright © 2011-2022 走看看