public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
String regex="2 * 10 / 5 * 3 ";
Calculator calculator=new Calculator();
int result=calculator.build(regex);
System.out.println("===result="+result);
}
}
上面是调用测试的代码,下面是画的模型图,当然其实有更简便的方法,这里用java设计模式之解释器模式来实现。
//抽象节点
public interface Node {
public int compute();
}
//二叉树最边沿节点
public class LastNode implements Node{
private int value;
public LastNode(int value) {
// TODO Auto-generated constructor stub
this.value=value;
}
@Override
public int compute() {
// TODO Auto-generated method stub
return value;
}
}
//节点node实现类,二叉树的节点
public abstract class ValueNode implements Node {
protected Node leftNode;
protected Node rightNode;
public ValueNode(Node leftNode,Node rightNode) {
// TODO Auto-generated constructor stub
this.leftNode=leftNode;
this.rightNode=rightNode;
}
}
下面是符号节点
public class DivideNode extends ValueNode {
//除法节点符
public DivideNode(Node leftNode, Node rightNode) {
super(leftNode, rightNode);
// TODO Auto-generated constructor stub
}
@Override
public int compute() {
// TODO Auto-generated method stub
return leftNode.compute()/rightNode.compute();
}
}
public class MultyNode extends ValueNode {
//乘法符节点
public MultyNode(Node leftNode, Node rightNode) {
super(leftNode, rightNode);
// TODO Auto-generated constructor stub
}
@Override
public int compute() {
// TODO Auto-generated method stub
return leftNode.compute()*rightNode.compute();
}
}
总结:1必须有一个抽象接口
2构建语法树
应用场景: 1简单的语言需要解释执行而且可以将该语言中的语句表示一个抽象的语法树
2对于某个特定的领域出现的不断重复的问题,可以转换成一种语法规则下的语句
这种思想高度概括的模式是比较难的,实际使用场景也是比较少,算是很生僻的一种模式,最常见的是正则表达式。