解释器模式

解释器模式(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
终端解释器处理后==啦啦啦卖报卖报。。。
终端解释器处理后==啦啦啦卖报卖报。。。
非终端解释器处理后==嘟嘟啦卖报卖报。。。
终端解释器处理后==啦啦啦卖报卖报。。。
测试打印
原文地址:https://www.cnblogs.com/cai170221/p/13404557.html