解释器模式(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 }
1 public abstract class AbstractExpression { 2 public abstract void interpret(Context context); 3 }
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 }
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 }
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 }
终端解释器处理后==啦啦啦卖报卖报。。。 终端解释器处理后==啦啦啦卖报卖报。。。 非终端解释器处理后==嘟嘟啦卖报卖报。。。 终端解释器处理后==啦啦啦卖报卖报。。。