java 设计模式_行为型_18解释器模式
18.解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。
解释器模式在我们开发过程中并不常用,是个比较小众的设计模式。这种模式通常被用在 SQL 解析、符号处理引擎等。
什么是符号处理引擎呢?举几个例子,
强大而又令人望而却步的正则表达式,相信大多数程序猿都接触过吧,[0-9a-zA-Z]+这样一串符号就能够匹配一个由数字和大小写字母组成的字符串。类似的还有XML文件的解析、SQL语句的解析等等。
假设你做了一个机器人,可以通过指令告诉它如何执行动作,比如向前走10个单位是forward 10,向左转是turn left,当你输入begin forward 10 turn left forward 5 end 组成的命令给它的终端,它就能明白命令的意思(向前走10个单位然后左转走5个单位)并执行。
在举个简单点的例子,正则表达式,我们通常用的计算器是一步一步来的,比如2+3-4/2=当输入+、-``/和=的时候都会立即响应。但是还有种计算器,可以在输入整个公式后,一并进行计算,这种计算器可以直接输入2+3-4/2然后回车后直接给出整个式子的结果,这种计算器就是“解释型”计算器。
UML用例图:
一、先声明一个解释型接口
public interface Expression {double interpret();
}
二、终结符表达式
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Num implements Expression {private double number;@Overridepublic double interpret() {return number;}
}
三、非终结符表达式(分别对应加减乘除)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Add implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()+right.interpret();}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sub implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()-right.interpret();}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mul implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()*right.interpret();}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Div implements Expression {private Expression left,right;@Overridepublic double interpret() {return left.interpret()/right.interpret();}
}
四、测试类
public class InterpretTest {public static void main(String[] args) {Expression a = new Num(2),b=new Num(3),c=new Num(4),d=new Num(2);Expression result = new Sub(new Add(a,b),new Div(c,d));System.out.println(result.interpret());}
}