如何用面向对象的方法来描述四则运算表达式

前几天面试碰到一道题,当时没有做,忽然想了起来,如下<BR><BR><BR>四则运算表达式的例子是 1 + 5,或者是 ( 2 + 6 ) / ( 4 - 2 )。<BR><BR>如何用面向对象的方法来描述四则运算表达式.<BR><BR>分析如下: <BR> 看起来有三个对象 数值 ,运算符,表达式(如1+5,( 2 + 6 ) / ( 4 - 2 )都是表达式),因为数值和<BR> 和表达式拥有一样的特性,都是靠运算符连接起来,可提出公共接口(在没有把数值和表达式的关系找到的时候,我的思考完全进行不下去).<BR><BR>Biao.java 表达式接口<BR>BiaoB.java 非数值表达式 实现Biao.java<BR>BiaoValue.java 数值表达式 实现Biao.java<BR><BR><BR>Fu.java 运算符接口 <BR>FuPlus.java 加运算符 实现Fu.java<BR>FuC.java 乘运算符 实现Fu.java<BR>FuJ.java 减运算符 实现Fu.java<BR><BR><BR>测试 5- 2*(3+4)<BR>class Main {<BR> public static void main(String[] a) {<BR> Fu plusFu = new FuPlus();<BR> Biao bV1 = new BiaoValue(3);<BR> Biao bV2 = new BiaoValue(4);<BR> Biao b = new BiaoB(bV1,bV2,plusFu); //3+4<BR> System.out.println("==="+b.result());<BR> <BR> <BR> Biao bV3 = new BiaoValue(2);<BR> Biao bb = new BiaoB(bV3,b,new FuC()); //2*(3+4)<BR> System.out.println("==="+bb.result());<BR> <BR> Biao bV4= new BiaoValue(5);<BR> Biao bbb = new BiaoB(bV4,bb,new FuJ()); 5- 2*(3+4)<BR> <BR> System.out.println("==="+bbb.result());<BR> }<BR>}<BR><BR> <BR><BR>类代码:<BR><BR> interface Biao{<BR> int result() ;<BR>}<BR><BR> class BiaoB implements Biao {<BR> Biao b1;<BR> Biao b2;<BR> Fu fu;<BR> BiaoB(Biao b1,Biao b2,Fu fu){<BR> this.b1 = b1;<BR> this.b2 = b2;<BR> this.fu = fu;<BR> }<BR> public int result() {<BR> if(fu==null) return b1.result();<BR> return fu.result(b1,b2);<BR> }<BR>}<BR><BR>class BiaoValue implements Biao {<BR> int i;<BR> BiaoValue(int i){<BR> this.i = i;<BR> }<BR> public int result() {<BR> return i;<BR> }<BR>}<BR><BR> <BR><BR>interface Fu {<BR> int result(Biao b1,Biao b2);<BR>}<BR><BR>public class FuC implements Fu{<BR> public int result(Biao b1,Biao b2) {<BR> return b1.result() * b2.result();<BR> }<BR>}<BR><BR>public class FuJ implements Fu{<BR> public int result(Biao b1,Biao b2) {<BR> return b1.result() - b2.result();<BR> }<BR>}<BR>class FuPlus implements Fu{<BR> public int result(Biao b1,Biao b2) {<BR> return b1.result() + b2.result();<BR> }<BR>}<BR><BR>

java.math.BigDecimal

freebox 你的留言是什么意思?

觉得这两个相似,可以参考一下它的实现。

THIS MESSAGE HAS BEEN MASKED

java.math.BigDecimal
的实现看了,看来我的运算符类有些多余,因为只有四种运算符,已经固定了,不需要考虑他的变化。
放到表达式类里直接写方法就可以了,如add() 等

很有意思的一道题。我以前是采用树型结构来解决。
首先写一个ValueNode接口其中包含一个方法getValue
运算符节点和值结点均实现该结口.
其中运算符节点有包含左右结点两个(即左右的值),且getValue方法返回左右结点计算后的值(不同的运算符有不同的实现)
按照这个思路,从第一个结点开始依次往下可以组成一个树,调用第一个结点的getValue是即依次调用下一个结点的getValue,结果从第一个结点返回