登陆注册
15296300000199

第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中提供的,当然还有更好、更专业的实现方式。对于终结符,建议采用享元模式来共享它们的拷贝,因为它们要多次重复出现。但是考虑到享元模式的使用局限性,建议还是当你的系统中终结符重复的足够多的时候再考虑享元模式。”

同类推荐
  • 条形码技术与应用

    条形码技术与应用

    条形码是一种可供电子仪器自动识别的标准符号,是由一组黑白相间、粗细不同的条、空符号按一定编码规则排列组成的标记,用以表示一定的信息,确认某个物体或规定它的移动,能正确快速地为产、供、销各环节在采集、处理和交换信息时提供标识。
  • 一本书读懂大数据

    一本书读懂大数据

    本书是深入研究互联网思维的经典之作,从互联网思维的定义到互联网思维应用的具体案例表现。作者深入浅出、条分缕析,全面阐述互联网思维的内核与精神,逐一点评当前关于互联网思维的各种观点。本书从最初级的互联网思维应用到高端的粉丝经济,平台建设,自媒体营销的方法都有详细讲解介绍。让读者了解什么是互联网思维的同时还能学会把互联网思维运用到自己的工作学习已经生活中。
  • 如何组装电脑

    如何组装电脑

    本书以问答的形式介绍了组装电脑的基本知识。内容包括:电脑硬件的部件组成、CPU的发展历程、CPU主频、内存的组成、内存的主要性能参数等。
  • 办公软件高级应用

    办公软件高级应用

    日新月异的信息技术使计算机的应用渗透到各行各业,融入到我们的工作、学习和生活中,特别是在办公领域中运用计算机技术,可以实现办公自动化,成倍地提高工作效率。在众多的办公软件中,微软公司的Office系列软件是办公自动化软件中的佼佼者,其强大的功能深受全世界广大用户的青睐。根据当前业界的需求以及办公软件的实际应用范围,本书针对Office2003系列产品,深入讲解其高级应用知识和操作技能。
  • 黑客就在你身边

    黑客就在你身边

    互联网络正在改变着我们的生活,每个人都处在互联网的天罗地网之中。本书以轻松的笔调,向人们介绍了有关“黑客”的知识。当你读完这本书后,你会发觉“黑客”一点都不神秘,他们渴望全社会对他们有一个公正的评价。
热门推荐
  • 萌宠碗里来:厨神大小姐

    萌宠碗里来:厨神大小姐

    娇蛮大小姐花样作死,香消玉殒,神厨特工意外穿越取而代之。没有灵力?抱歉,只是天赋太好来得太晚而已。娇蛮任性?呵呵,让你知道什么是冷面杀手。死缠烂打?师兄,就你这样的,给我一打我都懒得要。不学无术?拜托,没见我身后跟着一只霸气神兽吗。男主何在?嘿嘿,你猜。
  • 豪门宠妻:钟总裁的美人鱼

    豪门宠妻:钟总裁的美人鱼

    毛里求斯的海岸,她对她一见钟情。家破人亡之际,他像救世主一样救了她。爱到无法自拔之时,他却狠心背叛。为了他,她牺牲了自己,为了她,他放弃了自己。美人鱼将刀口刺向自己,王子没有忘记她……
  • 两爱绕指柔:大辽谍女

    两爱绕指柔:大辽谍女

    一切都是阴谋,他落入一个温柔的陷阱。偏偏,他又不是一个多情的男子,负了最初的诺言,两爱纠缠成心结,结局能否无伤……
  • 随身带上15个习惯

    随身带上15个习惯

    美国成功学大师拿破仑·希尔说:“习惯能够成就一个人,也能够摧毁一个人。”英国伟大的思想家、哲学家培根曾说:“习惯是人生的主宰。心理学巨匠威廉·詹姆士又说:“播下一个行动,你将收获一种习惯;播下一种习惯,你将收获一种性格;播下一种性格,你将收获一种命运。”习惯对我们有着巨大的影响,它在不知不觉中,经年累月地影响着我们的行为,左右着我们的成败。一个人一天的行为中,大约只有5%是属于非习惯性的,而剩下的95%的行为都是习惯性的。即便是打破常规的创新,最终也可能演变成为习惯性的创新。
  • 女王成长攻略

    女王成长攻略

    一个好不容易熬到高中毕业生,原本把人生计划好,上大学做米虫。天有不测风云,亲亲老妈当头给了她一棒,赶鸭子上架去做瓷砖销售员,美名其曰:一母传女业,二让你锻炼锻。炼天生孤僻的她,如何玩转人生的天堂。
  • 神泣

    神泣

    夏天麒,一个普通打工仔,意外融合了十方第一神器“神泣”拥有了古怪的异能“天剑”,从此,天剑在手,神器我有,君临三界,神佛妖魔如蝼蚁!且看主角如何通过自身的古怪异能,踏R灭M,扬我华威!携美纵横,称霸宇内!
  • 悦茹寒exo

    悦茹寒exo

    女主利用明星们的复仇之路,却爱上被利用的他
  • 幻梦:已是异世

    幻梦:已是异世

    莫欺少年穷!原是家族天骄,却因意外而成为一代弃子,一世炉鼎;历经生死入墓得铭,铲除意外,却为自己身世的真真假假所疑惑,从此踏上寻找记忆之路;辗转几旬终明了,哪知最爱竟拔剑相向……斯人已矣,真相初露端倪。且看少年陈若沫死后化身莫尘来临异世,了却人生如梦之悲怆!
  • 我与死神同行

    我与死神同行

    本书讲述主人公刻苦修炼,成功打败了死神,拯救了世界的故事
  • 晨暖初城

    晨暖初城

    对于沈宥来说,那就是天边的彩虹,看着很美,可是抓不着,她也不想琢磨透。长大后第一次出任务,就闯了个大祸。她把别人的心上人‘弄’丢了!为了补偿,她跟着冰木头去寻人,一路上认识了新朋友也遇到不少麻烦。日子慢慢的过去。她突然发现她爱上了冰木头。可是……她得到的只有痛苦。如果,你可以活两辈子,面对把你心肝脾肺肾伤个透的那人,你会怎么选择?江进珩一直是别人世界中的男配角,而他也乐在其中,只为了心上人能记住他。他从未想过自己也能拥有爱情,能爱上别人。可,为什么他爱的人离他越来越远……