工厂设计模式课件_第1页
工厂设计模式课件_第2页
工厂设计模式课件_第3页
工厂设计模式课件_第4页
工厂设计模式课件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java设计模式工厂设计模式Java设计模式工厂设计模式理解并会使用EL理解并会使用常用的JSTL标签本章目标理解并会使用EL本章目标面试请用C++,Java,C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果?小菜今年计算机专业大四,一心想找份好工作,投了无数份简历后,终于得到一个面试机会。小菜三下五除二写完了代码仔细检查后没有发现错误交卷后,单位通知他一周内等消息面试请用C++,Java,C#或VB.NET小菜代码Scannerin=newScanner(System.in);System.out.println("请输入数字A:");StringA=in.next();System.out.println("请选择运算符号(+、=、*、/):");StringB=in.next();System.out.println("请输入数字B:");StringC=in.next();StringD="";

if(B.equals("+"))D=String.valueOf(Double.parseDouble(A)+Double.parseDouble(C));

if(B.equals("-"))D=String.valueOf(Double.parseDouble(A)-Double.parseDouble(C));

if(B.equals("*"))D=String.valueOf(Double.parseDouble(A)*Double.parseDouble(C));

if(B.equals("/"))D=String.valueOf(Double.parseDouble(A)/Double.parseDouble(C));System.out.println("结果是:"

+D);小菜代码Scannerin=newScanner(Sys面试受挫一个月后仍然没有消息,我的代码实现了啊,怎么不给我机会?寻求帮助小菜找到从事软件开发工作7年的表哥大鸟请教大鸟问了题目和了解小菜的代码后哈哈大笑:”你上当了,人家单位出题的意思,你完全没有明白”面试受挫一个月后仍然没有消息,我的代码实现了啊,怎么不给我机初学者代码毛病大鸟说:首先现在的代码需要改进的地方有很多。Scannerin=newScanner(System.in);System.out.println("请输入数字A:");StringA=in.next();System.out.println("请选择运算符号(+、=、*、/):");StringB=in.next();System.out.println("请输入数字B:");StringC=in.next();StringD="";

if(B.equals("+"))D=String.valueOf(Double.parseDouble(A)+Double.parseDouble(C));

if(B.equals("-"))D=String.valueOf(Double.parseDouble(A)-Double.parseDouble(C));

if(B.equals("*"))D=String.valueOf(Double.parseDouble(A)*Double.parseDouble(C));

if(B.equals("/"))D=String.valueOf(Double.parseDouble(A)/Double.parseDouble(C));System.out.println("结果是:"

+D);命名不规范判断分支,这样写意味着程序做了三次无用功.除数为0或除数是字符串怎么办?初学者代码毛病大鸟说:首先现在的代码需要改进的地方有很多。S代码规范Scannerin=newScanner(System.in);System.out.println("请输入数字A:");StringstrNumberA=in.next();System.out.println("请选择运算符号(+、=、*、/):");StringstrOperate=in.next();System.out.println("请输入数字B:");StringstrNumberB=in.next();StringstrResult="";try{if(strOperate.equals("+")) strResult=String.valueOf(Double.parseDouble(strNumberA)+Double.parseDouble(strNumberB));elseif(strOperate.equals("-")) strResult=String.valueOf(Double.parseDouble(strNumberA)-Double.parseDouble(strNumberB));elseif(strOperate.equals("*")) strResult=String.valueOf(Double.parseDouble(strNumberA)*Double.parseDouble(strNumberB));elseif(strOperate.equals("/")){ Doubled=Double.parseDouble(strNumberB);if(d!=0){ strResult=String.valueOf(Double.parseDouble(strNumberA)/Double.parseDouble(strNumberB));}else{ strResult="除数为零!";}} System.out.println("结果是:"

+strResult);}catch(Exceptione){ System.out.println("输入有误");}代码规范Scannerin=newScanner(S面向对象小菜按照大鸟的建议改写了代码?可是这样写出的代码是否符合出题人的意思呢?任意一种面向对象语言。使用面向对象的编程方法实现请用C++,Java,C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果?面向对象小菜按照大鸟的建议改写了代码?可是这面向对象所有初学者都会有这样的问题。碰到问题就直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。用计算机的方式去思考比如计算器这个程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前的需求。不容易维护不容易扩展不容易复用如何才能容易维护,容易扩展,又容易复用呢?面向对象所有初学者都会有这样的问题。不容易维护如何才能容易维活字印刷面向对象喝酒唱歌,人生真爽,……这里面问题出在哪呢?话说三国时期,曹操带领百万大军攻打东吴…对酒当歌,人生真爽,……对酒当歌,人生几何?……三国时期活字印刷还未发明活字印刷面向对象喝酒唱歌,人生真爽,这里面问题出在哪呢?话活字印刷面向对象喝酒唱歌,人生真爽,如果有了活字印刷,只需要改4个字要改,只需更改要改的字—可维护对当几何字并非用完就无用,可以在以后印刷中重复使用—可复用此诗若要加字,只需另外刻字加入—可扩展字的排列其实可能是竖排或横排,只需移动字的位置就可—灵活性好程序开发有太多类似曹操这样的客户,不断的更改需求,客户要求也不份,不就是改几个字吗?面对已完成的程序代码,修改几个字都有可能需要重头再来,实在痛苦。灵活利用面向对象三大特性,来完善程序活字印刷面向对象喝酒唱歌,面向对象如果现在我们再写一个Windows的计算器,那么前面的代码能否复用?复制代码,初级程序员的工作就是Ctrl+C,Ctrl+V代码越多时,维护就麻烦尽量减少重复前面代码有多少和控制台无关,而只是和计算器有关?面向对象如果现在我们再写一个Windows的业务封装业务逻辑与界面逻辑分开,只有分离才可以达到容易维护或扩展。单独分离出一个类:Operation运算类Operation类主要用于计算,与界面等无关不单控制台程序能用,Swing能用,Web程序同意能用三个参数,两个为输入数,一个为操作符业务封装业务逻辑与界面逻辑分开,只有分离才可以达到容易维护或业务封装publicclassOperation{publicstaticdoubleGetResult(StringstrNumberA,StringstrNumberB,StringstrOperate){doublestrResult=0d;try{if(strOperate.equals("+"))strResult=(Double.parseDouble(strNumberA)+Double.parseDouble(strNumberB));elseif(strOperate.equals("-"))strResult=(Double.parseDouble(strNumberA)-Double.parseDouble(strNumberB));elseif(strOperate.equals("*"))strResult=(Double.parseDouble(strNumberA)*Double.parseDouble(strNumberB));elseif(strOperate.equals("/")){Doubled=Double.parseDouble(strNumberB);if(d!=0){strResult=(Double.parseDouble(strNumberA)/Double.parseDouble(strNumberB));}else{strResult=0;}}}catch(Exceptione){strResult=0;}returnstrResult;}}Scannerin=newScanner(System.in);System.out.println("请输入数字A:");StringstrNumberA=in.next();System.out.println("请选择运算符号(+、=、*、/):");StringstrOperate=in.next();System.out.println("请输入数字B:");StringstrNumberB=in.next();DoublestrResult=Operation.GetResult(strNumberA,strNumberB,strOperate);System.out.println("结果是:"

+strResult);Operation控制台现在是完全面向对象吗?只用了面向对象三大特性中的一个:封装继承?多态?

如果我希望增加一个求最大值(Max)的运算,如何修改?

elseif(strOperate.equals("max")){strResult=Math.max(Double.parseDouble(strNumberA),Double.parseDouble(strNumberB));}

弊端与问题:1.整个运算类都要参与编译2.万一其它运算被你修改,而没有发现问题?3.不同程序员同时在增加新的运算算法,怎么办?业务封装Scannerin=newScanner(S继承利用继承,重新编写Operation类,Operation类为基类,充当接口的角色拥有两个属性,分别保存操作数和被操作数NumberANumberB拥有一个方法,此方法为虚方法,能被重写(因为不同运算会有不同的算法返回不同的值),返回运算值。virtualdoubleGetResult()继承利用继承,重新编写Operation类,Operati继承publicclassOperation{protecteddoublenumberA=0;protecteddoublenumberB=0;publicdoublegetNumberA(){ returnnumberA;}publicvoidsetNumberA(doublenumberA){ this.numberA=numberA;}publicdoublegetNumberB(){ returnnumberB;}publicvoidsetNumberB(doublenumberB){ this.numberB=numberB;}publicdoubleGetResult(){ doubleresult=0; returnresult;}}Operation

类基类//加法类,继承运算类classOperationAddextendsOperation{publicdoubleGetResult(){doubleresult=0;result=NumberA+NumberB;returnresult;}}//减法类,继承运算类classOperationSubextendsOperation{publicdoubleGetResult(){doubleresult=0;result=NumberA-NumberB;returnresult;}}其它的运算算法类…..如何让程序知道哪个算法?怎么调用写的算法类?继承publicclassOperation{Oper多态利用多态,来实现到底要实例化谁,单独用一个类来实现创造实例的过程,这就是工厂。OperationFactory充当实例化的工厂,通过这个类利用多态来实例化运算算法类这个工厂比较简单,返回统一的父类即Operation类。publicclassOperationFactory{

publicstaticOperationcreateOperate(Stringoperate)

{Operationoper=null;

if(operate.equals("+")){oper=newOperationAdd();}elseif(operate.equals("-")){oper=newOperationSub();

}

returnoper;

}}Scannerin=newScanner(System.in);System.out.println("请输入数字A:");StringstrNumberA=in.next();System.out.println("请选择运算符号(+、=、*、/):");StringstrOperate=in.next();System.ou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论