• 解释器模式


    解释器模式(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
    终端解释器处理后==啦啦啦卖报卖报。。。
    终端解释器处理后==啦啦啦卖报卖报。。。
    非终端解释器处理后==嘟嘟啦卖报卖报。。。
    终端解释器处理后==啦啦啦卖报卖报。。。
    测试打印
  • 相关阅读:
    Solr的配置和在java中的使用
    druid + mysql + mybatis 批量更新报错
    linux find命令-print0和xargs中-0使用技巧
    Shell 函数相关
    公钥、私钥和数字签名这样最好理解
    Liunx find/locate/whereis/which 总结
    Linux find命令
    Shell bash 数学运算 bc
    Shell 使用 expr 进行数学运算
    Shell 有类型变量
  • 原文地址:https://www.cnblogs.com/cai170221/p/13404557.html
Copyright © 2020-2023  润新知