登陆注册
8183300000199

第199章 8 加减乘除

大B:“来举一个加减乘除的例子吧,实现思路来自于《java与模式》中的例子。每个角色的功能按照上面提到的规范来实现。”

//上下文(环境)角色,使用HashMap来存储变量对应的数值

class Context

{

private Map valueMap=new HashMap();

public void addValue(Variable x,int y)

{

Integer yi=new Integer(y);

valueMap。put(x,yi);

}

public int LookupValue(Variable x)

{

int i=((Integer)valueMap。get(x))。intValue();

return i;

}

}

//抽象表达式角色,也可以用接口来实现

abstract class EXPression

{

public abstract int interpret(Context con);

}

//终结符表达式角色

class Constant extends Expression

{

private int i;

public Constant(int i)

{

this。i=i;

}

public int interpret(Context con)

{

return i;

}

}

class Variable extends Expression

{

public int interpret(Context con)

{

//this为调用interpret方法的Variable对象

return con。LookupValue(this);

}

}

//非终结符表达式角色

class Add extends Expression

{

private Expression left,right;

public Add(Expression left,Expression right)

{

this。left=left;

this。right=right;

}

public int interpret(Context con)

{

return left。interpret(con) right。interpret(con);

}

}

class SuBTract extends Expression

{

private Expression left,right;

public Subtract(Expression left,Expression right)

{

this。left=left;

this。right=right;

}

public int interpret(Context con)

{

return left。interpret(con)-right。interpret(con);

}

}

class Multiply extends Expression

{

private Expression left,right;

public Multiply(Expression left,Expression right)

{

this。left=left;

this。right=right;

}

public int interpret(Context con)

{

return left。interpret(con)*right。interpret(con);

}

}

class Division extends Expression

{

private Expression left,right;

public Division(Expression left,Expression right)

{

this。left=left;

this。right=right;

}

public int interpret(Context con)

{

try{

return left。interpret(con)/right。interpret(con);

}catch(ArithmeticException ae)

{

System。out。println(“被除数为0!”);

return-11111;

}

}

}

//测试程序,计算(a*b)/(a-b 2)

public class Test

{

private static Expression ex;

private static Context con;

public static void main(String[]args)

{

con=new Context();

//设置变量、常量

Variable a=new Variable();

Variable b=new Variable();

Constant c=new Constant(2);

//为变量赋值

con。addValue(a,5);

con。addValue(b,7);

//运算,对句子的结构由我们自己来分析,构造

ex=new Division(new Multiply(a,b),new Add(new Subtract(a,b),c));

System。out。println(运算结果为: ex。interpret(con));

}

}

大B:“解释器模式并没有说明如何创建一个抽象语法树,因此它的实现可以多种多样,在上面我们是直接在Test中提供的,当然还有更好、更专业的实现方式。对于终结符,建议采用享元模式来共享它们的拷贝,因为它们要多次重复出现。但是考虑到享元模式的使用局限性,建议还是当你的系统中终结符重复的足够多的时候再考虑享元模式。”

同类推荐
  • 多媒体技术

    多媒体技术

    多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术
  • 不懂PowerPoint就当不好经理

    不懂PowerPoint就当不好经理

    经理人如何用PowerPoint,来规划部门的发展,如何用PowerPoint来表达自己的经营主张?本书为各类经理人提供了从入门到提高,从原理到实战的一系列知识,相信本书将让演示文稿为经理人的管理效能加分!
  • Delphi程序设计教程

    Delphi程序设计教程

    本书为适应不同层次读者的需要,从Delphi的基本知识讲起,由浅入深,全面讲述了Delphi的集成开发环境、Delphi的编程语言——ObjectPascal、常用组件的使用、窗体的设计、菜单的设计、对话框的设计、多文档界面程序的设计、多媒体编程和数据库应用程序设计等内容。
  • 《Internet实用技术》作业集

    《Internet实用技术》作业集

    随着计算机应用的普及和社会信息化水平的提高,Internet已走进我们的生活。《Internet实用技术》这门课将带领我们走进网络的神秘殿堂,让我们认识网络,了解网络,进而学会使用网络,维护网络。其范围涵盖了在授课过程中所讲授的内容,题型多样,内容丰富,并附有两套模拟题,最后附有答案。学生可按照课程进度做习题来巩固和掌握知识。本作业集由李琳编写,由西北工业大学网络教育学院负责组稿和审定。因为时间仓促,水平有限,错误和不当之处在所难免,敬请读者批评指正。
  • 纵横于天地之间——互联网络技术

    纵横于天地之间——互联网络技术

    本书告诉你:不管你是谁,只要生活在当前的时代,你一定知道电话,知道电脑,知道上网……知道许许多多关于电子、关于计算机、关于网络的话题,这就是网络时代。网络的话题可多了:它是怎么来的?什么是“蜘蛛网”?网络的过去和现在,上网的方法,如何使用网络,互联网的安全,网络有“陷阱”吗?网络有“瘾”吗?网络文化和未来又是怎样的?到书中去找答案吧!
热门推荐
  • 追仙道途

    追仙道途

    一个出身佛门净土的少年,出身背景凄然漠漠,幼小被禅师收养,十几年来修道大成,成为了寻回六宝的天人之一。只不过,当一次又一次陷入万古第一天阵时候,他的一切开始从零开始...叶休道:“我很平凡,但却很不平凡!”——————————————————新书上传,需要大家的支持,谢谢你们!
  • 女尊之我只是个米虫

    女尊之我只是个米虫

    为了爱情,我失去父母,失去姐妹。。。。如果能够再给我次机会,再不接触爱情,只为自己心中丘壑,努力奋斗~
  • 聆听心的选择:巴菲特给年轻人的24堂财富人生课

    聆听心的选择:巴菲特给年轻人的24堂财富人生课

    《聆听心的选择(巴菲特给年轻人的24堂财富人生课)》由成杰所著,《聆听心的选择(巴菲特给年轻人的24堂财富人生课)》中的主角股神巴菲特,美国人称其为100年来最伟大的投资者,个人财富45年间增长了575倍。他的一举一动都影响全球市场走势,是宣称在死后50年仍能产生影响的人!巴菲特是一个长期投资家,他的爱好就是寻找可靠地股票,把它尽可能便宜地买进,尽可能长久地保存,然后坐看它的价值一天天地增长。
  • 健康零食:知道这些就够了

    健康零食:知道这些就够了

    在合适的时间吃一些健康的零食,除了能获得‘享受’的同时,还能提供部分能量和营养素。作者戴尔·沃勒在圣路易斯长大,现居匹兹堡。他曾在海军服役,目前是一名核能工程师,写作是他的兼职工作之一。他自2013年开始自出版创作,至今已有百本涉及人文社科领域各类话题的作品与读者见面。
  • 妖孽邪皇逼良为妃

    妖孽邪皇逼良为妃

    前生是丫星光灿烂的大明星,投胎忘了喝汤的她牛批哄哄地在古代混得风生水起。本想坐拥美男,逍遥一生。熟料一次入宫探亲,撞上大内侍卫在把妃!给贴身丫头进行成人教育之时,表演者竟是自己滴亲姐姐和大表哥!一时矫情跑去湖边悼妃,竟然狗血地遇见上辈子没攻下的梦中情人!当她决定洗心革面,由疯兔变淑女,誓要拉着他的大手到白头的时候,冷不丁杀出一妖孽把她给办了!这人生还能再荒唐点吗?
  • 回到三国的无敌特种兵

    回到三国的无敌特种兵

    王牌特种兵不幸陨落,回到东汉末年三国乱世,只有寡母依靠,家徒四壁出身低微,在强人横行肆意杀戮的乱世之中,本不欲欺人,然而人欺我,本无意杀人,可别人向我举屠刀!回到人吃人的年代,仍然要做顶天立地的铁血男子汉,犯我者死!
  • 顼匕禾的猫

    顼匕禾的猫

    盛开雨天的花,名字陌生着。雨下的不经意,淅淅沥沥。伞会收起,就好像我们爱了散掉,爱过就好。
  • 亲爱的请相信爱情

    亲爱的请相信爱情

    一场车祸造成了一个不是结果的结果,原本应该和他步入礼堂的人却把她最要好的姐妹拥入怀抱!原本对她疼爱有加的养父养母对她不闻不问!原来紫梦还是一个人,既然爱情没有天长地久那我就选择不要,只有守住自己的心才不会被伤害,可当爱情再次降临·········原来不是说不爱就会不爱,只是丘比特之箭还没有碰到那个一触即发的人,就算是再冰冷的心也会慢慢变得鲜红······
  • 重生将门:惊世王妃谋天下

    重生将门:惊世王妃谋天下

    【本文背景架空,主角双强、1V1双处。欢迎入坑~】“蔺曦蕴你站住!本郡主愿意跟你一起嫁给懿王哥哥了!”“哦?郡主松口了?”“你还不跪下向本郡主叩谢?”“噗嗤,你愿意与我分享江珩。可是我不愿意呢。”“特别巧的是,我现在就很喜欢江珩。说我蛮横无理也好,说我胆大妄为也罢,反正,我喜欢他,他就只能是我一个人的,就请郡主先滚可好?”“你…你目中无人!懿王哥哥是不会让你这样欺负我的!”“哦?没有呢。曦儿喜欢就好。我都听曦儿的。”于是…温柔动人的清柔郡主就被气跑了…“曦儿,现在碍眼的人都消失了。我们继续回榻上…把我们上次没做完的继续做完吧~曦儿如果介意的话,床上也行。”某王爷一脸娇羞。
  • 化灵护鹿一生

    化灵护鹿一生

    “我要的就是你活着”林萧然面对这个爱了整整四年的人,看他终究连她的名字也不知道。就以她化为灵魂也会护他一生……