定义:
解释器模式(interpreter):给定1个语言,定义它的文法的1种表示,并定义1个解释器,这个解释器使用该表示来解释语言中的句子。
结构图:
AbstractExpression解释器模式抽象类
package ding.study.designpatterns.interpreter;
/**
* 解释器模式抽象类
* - 声明1个抽象的Interpret方法,抽象语法树中所有的节点都必须实现该抽象方法。
* @author daniel
*
*/
abstract class AbstractExpression {
//解释方法
public abstract void interpret(Context context);
}
Context解释器以外的1些全局信息
package ding.study.designpatterns.interpreter;
/**
* 解释器以外的1些全局信息
* Interpreter方法所需要的信息的容器,该信息对Interpreter而言全局可见。充当几个AbstractExpresssion
* 实例之间的通讯频道。
*
* @author daniel
*
*/
public class Context {
private String input;
private String output;
/**
* @return the output
*/
public String getOutput() {
return output;
}
/**
* @param output
* the output to set
*/
public void setOutput(String output) {
this.output = output;
}
/**
* @return the input
*/
public String getInput() {
return input;
}
/**
* @param input
* the input to set
*/
public void setInput(String input) {
this.input = input;
}
}
NonterminalExpression非终端解释器
package ding.study.designpatterns.interpreter;
/**
* 非终端解释器 另外1个实现了AbstractExpression
* 接口的类,用来处理语法树中非末端节点的语法。它含有下1个AbstractExpression(s)的援用,调用它每一个子节点的Interpret方法。
*
* @author daniel
*
*/
public class NonterminalExpression extends AbstractExpression {
@Override
public void interpret(Context context) {
System.out.println("非终端解释器");
}
}
TerminalExpression终端解释器
package ding.study.designpatterns.interpreter;
/**
* 终端解释器
* - 实现和语法中末端符号相干的Interpret方法。
- 在每一个句子的末端符号中均需要1个TerminalExpression实例。
* @author daniel
*
*/
public class TerminalExpression extends AbstractExpression {
@Override
public void interpret(Context context) {
System.out.println("终端解释器");
}
}
Client 客户端 ZTestMain
package ding.study.designpatterns.interpreter;
import java.util.ArrayList;
import java.util.List;
/**
* 解释器模式(interpreter):给定1个语言,定义它的文法的1种表示,并定义1个解释器,这个解释器使用该表示来解释语言中的句子。
*
* 输出:
* 终端解释器
非终端解释器
终端解释器
终端解释器
*
* @author daniel
* @email 576699909@qq.com
* @time 2016⑸⑶1 下午2:16:37
*/
public class ZTestMain {
/**
* @param args
*/
public static void main(String[] args) {
Context context = new Context();
List<AbstractExpression> list = new ArrayList<AbstractExpression>();
list.add(new TerminalExpression());
list.add(new NonterminalExpression());
list.add(new TerminalExpression());
list.add(new TerminalExpression());
for (AbstractExpression exp : list) {
exp.interpret(context);
}
}
}
履行结果
源代码
https://github.com/dingsai88/StudyTest/tree/master/src/ding/study/designpatterns/interpreter