




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Java設(shè)計模式工廠設(shè)計模式Java設(shè)計模式工廠設(shè)計模式理解并會使用EL理解并會使用常用的JSTL標簽本章目標理解并會使用EL本章目標面試請用C++,Java,C#或VB.NET任意一種面向?qū)ο笳Z言實現(xiàn)一個計算器控制臺程序,要求輸入兩個數(shù)和運算符號,得到結(jié)果?小菜今年計算機專業(yè)大四,一心想找份好工作,投了無數(shù)份簡歷后,終于得到一個面試機會。小菜三下五除二寫完了代碼仔細檢查后沒有發(fā)現(xiàn)錯誤交卷后,單位通知他一周內(nèi)等消息面試請用C++,Java,C#或VB.NET小菜代碼Scannerin=newScanner(System.in);System.out.println("請輸入數(shù)字A:");StringA=in.next();System.out.println("請選擇運算符號(+、=、*、/):");StringB=in.next();System.out.println("請輸入數(shù)字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("結(jié)果是:"
+D);小菜代碼Scannerin=newScanner(Sys面試受挫一個月后仍然沒有消息,我的代碼實現(xiàn)了啊,怎么不給我機會?尋求幫助小菜找到從事軟件開發(fā)工作7年的表哥大鳥請教大鳥問了題目和了解小菜的代碼后哈哈大笑:”你上當了,人家單位出題的意思,你完全沒有明白”面試受挫一個月后仍然沒有消息,我的代碼實現(xiàn)了啊,怎么不給我機初學者代碼毛病大鳥說:首先現(xiàn)在的代碼需要改進的地方有很多。Scannerin=newScanner(System.in);System.out.println("請輸入數(shù)字A:");StringA=in.next();System.out.println("請選擇運算符號(+、=、*、/):");StringB=in.next();System.out.println("請輸入數(shù)字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("結(jié)果是:"
+D);命名不規(guī)范判斷分支,這樣寫意味著程序做了三次無用功.除數(shù)為0或除數(shù)是字符串怎么辦?初學者代碼毛病大鳥說:首先現(xiàn)在的代碼需要改進的地方有很多。S代碼規(guī)范Scannerin=newScanner(System.in);System.out.println("請輸入數(shù)字A:");StringstrNumberA=in.next();System.out.println("請選擇運算符號(+、=、*、/):");StringstrOperate=in.next();System.out.println("請輸入數(shù)字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="除數(shù)為零!";}} System.out.println("結(jié)果是:"
+strResult);}catch(Exceptione){ System.out.println("輸入有誤");}代碼規(guī)范Scannerin=newScanner(S面向?qū)ο笮〔税凑沾篪B的建議改寫了代碼?可是這樣寫出的代碼是否符合出題人的意思呢?任意一種面向?qū)ο笳Z言。使用面向?qū)ο蟮木幊谭椒▽崿F(xiàn)請用C++,Java,C#或VB.NET任意一種面向?qū)ο笳Z言實現(xiàn)一個計算器控制臺程序,要求輸入兩個數(shù)和運算符號,得到結(jié)果?面向?qū)ο笮〔税凑沾篪B的建議改寫了代碼?可是這面向?qū)ο笏谐鯇W者都會有這樣的問題。碰到問題就直覺地用計算機能夠理解的邏輯來描述和表達待解決的問題及具體的求解過程。用計算機的方式去思考比如計算器這個程序,先要求輸入兩個數(shù)和運算符號,然后根據(jù)運算符號判斷選擇如何運算,得到結(jié)果,這本身沒有錯,但這樣的思維卻使得我們的程序只為滿足實現(xiàn)當前的需求。不容易維護不容易擴展不容易復用如何才能容易維護,容易擴展,又容易復用呢?面向?qū)ο笏谐鯇W者都會有這樣的問題。不容易維護如何才能容易維活字印刷面向?qū)ο蠛染瞥瑁松嫠@里面問題出在哪呢?話說三國時期,曹操帶領(lǐng)百萬大軍攻打東吳…對酒當歌,人生真爽,……對酒當歌,人生幾何?……三國時期活字印刷還未發(fā)明活字印刷面向?qū)ο蠛染瞥瑁松嫠@里面問題出在哪呢?話活字印刷面向?qū)ο蠛染瞥瑁松嫠绻辛嘶钭钟∷ⅲ恍枰?個字要改,只需更改要改的字—可維護對當幾何字并非用完就無用,可以在以后印刷中重復使用—可復用此詩若要加字,只需另外刻字加入—可擴展字的排列其實可能是豎排或橫排,只需移動字的位置就可—靈活性好程序開發(fā)有太多類似曹操這樣的客戶,不斷的更改需求,客戶要求也不份,不就是改幾個字嗎?面對已完成的程序代碼,修改幾個字都有可能需要重頭再來,實在痛苦。靈活利用面向?qū)ο笕筇匦裕瑏硗晟瞥绦蚧钭钟∷⒚嫦驅(qū)ο蠛染瞥瑁嫦驅(qū)ο笕绻F(xiàn)在我們再寫一個Windows的計算器,那么前面的代碼能否復用?復制代碼,初級程序員的工作就是Ctrl+C,Ctrl+V代碼越多時,維護就麻煩盡量減少重復前面代碼有多少和控制臺無關(guān),而只是和計算器有關(guān)?面向?qū)ο笕绻F(xiàn)在我們再寫一個Windows的業(yè)務(wù)封裝業(yè)務(wù)邏輯與界面邏輯分開,只有分離才可以達到容易維護或擴展。單獨分離出一個類:Operation運算類Operation類主要用于計算,與界面等無關(guān)不單控制臺程序能用,Swing能用,Web程序同意能用三個參數(shù),兩個為輸入數(shù),一個為操作符業(yè)務(wù)封裝業(yè)務(wù)邏輯與界面邏輯分開,只有分離才可以達到容易維護或業(yè)務(wù)封裝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("請輸入數(shù)字A:");StringstrNumberA=in.next();System.out.println("請選擇運算符號(+、=、*、/):");StringstrOperate=in.next();System.out.println("請輸入數(shù)字B:");StringstrNumberB=in.next();DoublestrResult=Operation.GetResult(strNumberA,strNumberB,strOperate);System.out.println("結(jié)果是:"
+strResult);Operation控制臺現(xiàn)在是完全面向?qū)ο髥幔恐挥昧嗣嫦驅(qū)ο笕筇匦灾械囊粋€:封裝繼承?多態(tài)?
如果我希望增加一個求最大值(Max)的運算,如何修改?
elseif(strOperate.equals("max")){strResult=Math.max(Double.parseDouble(strNumberA),Double.parseDouble(strNumberB));}
弊端與問題:1.整個運算類都要參與編譯2.萬一其它運算被你修改,而沒有發(fā)現(xiàn)問題?3.不同程序員同時在增加新的運算算法,怎么辦?業(yè)務(wù)封裝Scannerin=newScanner(S繼承利用繼承,重新編寫Operation類,Operation類為基類,充當接口的角色擁有兩個屬性,分別保存操作數(shù)和被操作數(shù)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;}}其它的運算算法類…..如何讓程序知道哪個算法?怎么調(diào)用寫的算法類?繼承publicclassOperation{Oper多態(tài)利用多態(tài),來實現(xiàn)到底要實例化誰,單獨用一個類來實現(xiàn)創(chuàng)造實例的過程,這就是工廠。OperationFactory充當實例化的工廠,通過這個類利用多態(tài)來實例化運算算法類這個工廠比較簡單,返回統(tǒng)一的父類即Operation類。publicclassOperationFactory{
publicstaticOperationcreateOperate(Stringoperate)
{Operationoper=null;
if(operate.equals("+")){oper=newOperationAdd();}elseif(operate.equals("-")){oper=newOperationSub();
}
returnoper;
}}Scannerin=newScanner(System.in);System.out.println("請輸入數(shù)字A:");StringstrNumberA=in.next();System.out.println("請選擇運算符號(+、=、*、/):");StringstrOperate=in.next();System.ou
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區(qū)治理與公共政策的關(guān)系試題及答案
- 項目需求變更的管理策略與試題與答案
- 教育政策的多維度影響試題及答案
- 軟件設(shè)計師備考指南試題及答案
- 機電工程行業(yè)的核心競爭力探討試題及答案
- 項目管理中的有效學習與分享機制試題及答案
- 公共政策評估中的數(shù)據(jù)挖掘方法試題及答案
- 軟件設(shè)計師考試模擬試題及答案分析
- 反腐敗政策的國際經(jīng)驗借鑒試題及答案
- 深入研究西方國家的公共衛(wèi)生治理試題及答案
- 靜脈治療并發(fā)癥的預(yù)防及處理護理課件
- tws藍牙耳機點膠工藝
- 《鼠小弟的生日》
- 全麻術(shù)后舌后墜護理
- 韓國《寄生蟲》電影鑒賞解讀
- GB 4806.13-2023食品安全國家標準食品接觸用復合材料及制品
- 新能源汽車研究結(jié)論論文題目
- 政府采購基礎(chǔ)知識培訓(最終稿)
- 重慶大學大學化學Ⅰ期末考試卷A
- 1例新冠病毒感染患者護理查房
- 經(jīng)閉孔無張力尿道中斷懸吊術(shù)
評論
0/150
提交評論