解释器模式,就跟它的名字一样,起到解释的作用,比如对一个表达式进行解释,使其能够被人们所理解,属于设计模式里的行为型模式一种
这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
优点:
- 可扩展性比较好,灵活。
- 增加了新的解释表达式的方式。
- 易于实现简单文法。
缺点:
- 可利用场景比较少。
- 对于复杂的文法比较难维护。
- 解释器模式会引起类膨胀。
- 解释器模式采用递归调用方法。
设计:
- 一个接口,定义表达式
- 实现接口,分实现类为表达式定义类和规则定义类
- main方法实现调用
代码:
//创建一个表达式接口
interface Expression{
boolean interpret(String context);
}
class TerminalExpression implements Expression{
private String data;
public TerminalExpression(String data) {
this.data=data;
}
public boolean interpret(String context){
if(context.contains(data)){
return true;
}
return false;
}
}
class OrExpression implements Expression{
private Expression expr1=null;
private Expression expr2=null;
public OrExpression(Expression expr1, Expression expr2) {
super();
this.expr1 = expr1;
this.expr2 = expr2;
}
public boolean interpret(String context){
return expr1.interpret(context)||expr2.interpret(context);
}
}
class AndExpression implements Expression{
private Expression expr1=null;
private Expression expr2=null;
public AndExpression(Expression expr1, Expression expr2) {
super();
this.expr1 = expr1;
this.expr2 = expr2;
}
public boolean interpret(String context) {
return expr1.interpret(context)&&expr2.interpret(context);
}
}
public class InterpreterPatternDemo {
public static Expression getFruitExpression() {
//规则:苹果和橘子是水果(或)
Expression apple=new TerminalExpression("Apple");
Expression orange=new TerminalExpression("Orange");
return new OrExpression(apple, orange);
}
//规则 女朋友很能吃(且)
public static Expression getEatAmieExpression(){
Expression amie=new TerminalExpression("女朋友");
Expression eat=new TerminalExpression("能吃");
return new AndExpression(amie,eat);
}
public static void main(String[] args) {
Expression isFruit=getFruitExpression();
Expression isAmie=getEatAmieExpression();
System.out.println("苹果是水果吗:"+isFruit.interpret("Apple"));
System.out.println("女朋友都能吃吗:"+isAmie.interpret("女朋友 能吃"));
}
}
输出:
苹果是水果吗:true
女朋友都能吃吗:true