解释器模式 - 代码指南
本文档详细说明解释器模式的代码实现和使用方法
一、项目结构
interpreter/
├── Expression.java # 抽象表达式
├── TerminalExpression.java # 终结符表达式
├── NonterminalExpression.java # 非终结符表达式
└── Context.java # 上下文二、代码详解
2.1 Expression - 抽象表达式
java
package com.linsir.designpattern.interpreter;
public interface Expression {
boolean interpret(String context);
}2.2 TerminalExpression - 终结符表达式
java
package com.linsir.designpattern.interpreter;
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpret(String context) {
return context.contains(data);
}
}2.3 OrExpression - 或表达式
java
package com.linsir.designpattern.interpreter;
public class OrExpression implements Expression {
private Expression expr1;
private Expression expr2;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}2.4 AndExpression - 与表达式
java
package com.linsir.designpattern.interpreter;
public class AndExpression implements Expression {
private Expression expr1;
private Expression expr2;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}三、使用示例
java
public class InterpreterTest {
public static void main(String[] args) {
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
// Robert 或 John
Expression orExpression = new OrExpression(robert, john);
System.out.println("John is male? " + orExpression.interpret("John"));
// Robert 和 John
Expression andExpression = new AndExpression(robert, john);
System.out.println("John and Robert? " + andExpression.interpret("John Robert"));
}
}