解释器模式介绍
解释器模式是指,将一种特定的语言或语法,解释为有用的信息。比如说将英语解释为中文、解析正则表达式、汇编语言解析为机器语言等这些都可以看作是解析器模式。通过解析器模式,甚至可以设计自己的语言,然后通过自定义的解析器去翻译它。例如,现在要实现一个需求,将hmhmwsbm
翻译成黑猫黑猫我是白猫
,就可以使用解释器模式去实现。
上面的图中包含了解释器模式所需要的角色信息,首先要有一个表示上下文的表达式,然后经过一系列的解释器最终得到解析的结果,其中非终结解释器是指解释的过程还没有结束,还需要传递到下一解释器继续对上下文进行解释,直到解释完成,在终结解释器中得到最终结果。
解释器模式示例代码
使用解释器模式代码将hmhmwsbm
翻译成黑猫黑猫我是白猫
。
创建表达式对象
/**
* 上下文对象
*/
public class Context {
//需要被解释的表达式
private String expression;
public Context(String expression) {
this.expression = expression;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
}
表达式中存储了hmhmwsbm
,这是一个需要被解释的表达式
创建抽象解释器
/**
* 抽象解释器
*/
public abstract class Expression {
/**
* 解释方法
* @param context 表达式对象
*/
public abstract void explain(Context context);
}
声明了用来解释表达式的抽象方法
创建三个具体的解释器
/**
* 黑猫解释器
*/
public class BlackExpression extends Expression{
private Expression white;
public BlackExpression() {
white = new WhiteExpression();
}
@Override
public void explain(Context context) {
context.setExpression(context.getExpression().replaceAll("hm", "黑猫"));
white.explain(context);
}
}
黑猫解释器中定义了解释器链中的下一个解释器白猫解释器whiteExpression
。当explain
方法完成当前解释后,将上下文内容交给下一解释器处理。
/**
* 白猫解释器
*/
public class WhiteExpression extends Expression{
private Expression other;
public WhiteExpression() {
this.other = new OtherExpression();
}
@Override
public void explain(Context context) {
context.setExpression(context.getExpression().replaceAll("bm", "白猫"));
other.explain(context);
}
}
白猫解释器中定义了解释器链中的下一个解释器其他内容解释器OtherExpression
。当explain
方法完成当前解释后,将上下文内容交给下一解释器处理。
/**
* 其他内容解释器
*/
public class OtherExpression extends Expression{
@Override
public void explain(Context context) {
context.setExpression(context.getExpression().replaceAll("ws", "我是"));
}
}
其他内容解释器不包含其他任何解释器对象,因为这个解释器是一个终结解释器,是解释器链的终点。
测试解释器模式
public class test_01 {
public static void main(String[] args) throws InterruptedException {
//创建上下文对象
Context context = new Context("hmhmwsbm");
//创建头解释器
Expression expression = new BlackExpression();
//向解释器链中添加上下文对象
expression.explain(context);
//输出解释后的结果
System.out.println(context.getExpression());
}
}
解释器模式执行的流程为:创建包含待解释信息的上下文对象————>创建解释器链中的头节点————>将上下文对象交给头解释器处理————>解释器链执行完毕后输出解释结果信息。
运行结果:
总结
解释器模式适用于对简单表达式的处理,并且实现起来并不复杂,可以根据具体的需求灵活的修改解释器的实现细节,但是需要注意的是,这种设计模式可能会产生很多类文件,所以不适合复杂的表达式业务场景,对于复杂表达式的处理,开发和维护也相对困难。