什么是行为模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
文法和解释器是编译原理课程中的术语,这里我们说的通俗一点,以例子来说明。语法好比我们编写Java中的class{}类,然而计算机并不识别,我们想要让他识别就需要安装jdk来做解释,jvm就相比是解释器。从而让我们写的代码可以运行在计算机上。
行为模式的适用场景
- 如果一个简单语言需要通过翻译,使得固定语句成为语法树。
- 某领域重复出现相似问题。
行为模式角色介绍
- AbstractExpression:抽象表达式
- TerminalExpression:终结符表达式
- NonterminalExpression:非终结符表达式
- Context:上下文环境
- Client:客户类
解释器模式用例
我们输入123456,输出是“abcdef ”,这里输入是平常123456但是我们的自定义的语法解释器确是把他解释成另外一种意思。
UML类图
AbstractInterpreter类:
public abstract class AbstractInterpreter {
abstract void interpreter(Context context);
}
Context:
public class Context {
String myNumNotation;
}
Number:
public class Number extends AbstractInterpreter {
Hashtable map = new Hashtable();
Number(){
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
map.put("4", "d");
map.put("5", "e");
map.put("6", "f");
}
@Override
void interpreter(Interpreter.Context context) {
String s = context.myNumNotation;
for(int i = 0;i <s.length();i++){
//截取i位置的字符串
String subs = s.substring(i,i+1);
//从table中获取对应的value值并输出
String r = map.get(subs).toString();
System.out.print(r);
}
}
}
主类测试:
public class Test {
public static void main(String[] args) {
Context context = new Context();
context.myNumNotation = "214536";
Number nn = new Number();
nn.interpreter(context);
}
}
测试结果:
badecf
解释器模式总结
解释器模式在简单的语言中使用,如果语言复杂,比如对应1+2*3+(4+3/2)^3像这样的语法结构要考虑的太多了,解释起来也很棘手。通常具体的文法规则和解释器是一一对应的关系,解释器的本质:将复杂的问题简单化、模块化、分离实现、解释执行。
解释器模式的优点在于高扩展性,当我们需要其他相应解释器,只需要扩展相应解释器即可,比如我们要增加将123456解释为Do、Re、mi、Fa、So、La只需要增加对应的解释器即可。缺点在于对于每一条文法都需要相应的解释器,如果文法过多,会生成大量的类,后期维护困难,对于复杂的文法,实现起来也是比较吃力的。