Design Patterns教程-解释器模式
解释器模式的定义是“定义一种语言的文法表示,并建立一个解释器来使用该表示来解释语言中的句子”。
基本上,解释器模式的应用领域有限。我们可以在形式文法方面讨论解释器模式,但在这一领域有更好的解决方案,因此它并不常用。
该模式可用于解析简单文法定义的表达式,有时也用于简单的规则引擎。
SQL解析使用了解释器设计模式。
解释器模式的优点
- 更容易更改和扩展文法。
- 实现文法相对简单。
解释器模式的使用场景
它用于:
- 当语言的文法不复杂时。
- 当效率不是优先考虑的因素时。
解释器模式示例
让我们通过上面的UML图来理解解释器模式的示例。
解释器模式的UML图:
上述UML的实现
第一步
创建一个Pattern接口。
public interface Pattern {
public String conversion(String exp);
}
第二步
创建一个InfixToPostfixPattern类,用于将中缀表达式转换为后缀表达式。
文件:InfixToPostfixPattern.java
import java.util.Stack;
public class InfixToPostfixPattern implements Pattern {
@Override
public String conversion(String exp) {
int priority = 0; // 操作符的优先级
String postfix = "";
Stack<Character> s1 = new Stack<Character>();
for (int i = 0; i < exp.length(); i++) {
char ch = exp.charAt(i);
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%') {
// 检查优先级
if (s1.size() <= 0) {
s1.push(ch);
} else {
Character chTop = (Character) s1.peek();
if (chTop == '*' || chTop == '/') {
priority = 1;
} else {
priority = 0;
}
if (priority == 1) {
if (ch == '*' || ch == '/' || ch == '%') {
postfix += s1.pop();
i--;
} else {
postfix += s1.pop();
i--;
}
} else {
if (ch == '+' || ch == '-') {
postfix += s1.pop();
s1.push(ch);
} else {
s1.push(ch);
}
}
}
} else {
postfix += ch;
}
}
int len = s1.size();
for (int j = 0; j < len; j++)
postfix += s1.pop();
return postfix;
}
}
第三步
创建一个InterpreterPatternClient类,使用中缀到后缀转换。
文件:InterpreterPatternClient.java
public class InterpreterPatternClient {
public static void main(String[] args) {
String infix = "a+b*c";
InfixToPostfixPattern ip = new InfixToPostfixPattern();
String postfix = ip.conversion(infix);
System.out.println("Infix: " + infix);
System.out.println("Postfix: " + postfix);
}
}
输出
Infix: a+b*c
Postfix: abc*+