工學(xué)4java面向?qū)ο笤O(shè)計(jì)課件_第1頁(yè)
工學(xué)4java面向?qū)ο笤O(shè)計(jì)課件_第2頁(yè)
工學(xué)4java面向?qū)ο笤O(shè)計(jì)課件_第3頁(yè)
工學(xué)4java面向?qū)ο笤O(shè)計(jì)課件_第4頁(yè)
工學(xué)4java面向?qū)ο笤O(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java面向?qū)ο笤O(shè)計(jì)思想計(jì)算機(jī)學(xué)院通信軟件工程中心張艷梅 1第1頁(yè),共21頁(yè)。本章主要內(nèi)容:1、一切皆對(duì)象一切皆對(duì)象。程序由對(duì)象構(gòu)成。對(duì)象由更小的對(duì)象構(gòu)成。每個(gè)對(duì)象有其職責(zé)。對(duì)象職責(zé)通過(guò)它的下屬對(duì)象的職責(zé)實(shí)現(xiàn)和下屬對(duì)象互相協(xié)作來(lái)實(shí)現(xiàn)。2、從實(shí)例體會(huì)OOP開(kāi)始使用對(duì)象繼承的好處接口可是個(gè)利器2第2頁(yè),共21頁(yè)。1、一切皆對(duì)象對(duì)象:是人們要進(jìn)行研究的任何事物,從最簡(jiǎn)單的整數(shù)到復(fù)雜的飛機(jī)等均可看作對(duì)象,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計(jì)劃和事件。對(duì)象具有狀態(tài),一個(gè)對(duì)象用數(shù)值來(lái)描述它的狀態(tài)。對(duì)象具體操作,用來(lái)改變對(duì)象的狀態(tài),操作就是對(duì)象的行為。對(duì)象實(shí)現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封閉于

2、對(duì)象的統(tǒng)一體中。3第3頁(yè),共21頁(yè)。1.1 一切皆對(duì)象理論上講,可從要解決的問(wèn)題身上提出所有概念性的組件,然后在程序中將其表達(dá)為一個(gè)對(duì)象。 當(dāng)我們進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)時(shí),面臨的最大一項(xiàng)挑戰(zhàn)性就是,如何把問(wèn)題描述轉(zhuǎn)化為對(duì)象架構(gòu)。 4第4頁(yè),共21頁(yè)。1.2 程序由對(duì)象構(gòu)成程序是一大堆對(duì)象的組合。例:Light lt = new Light();通過(guò)消息傳遞,各對(duì)象知道自己該做些什么。例:lt.on();lt.off();lt.brighten();lt.dim();為了向?qū)ο蟀l(fā)出請(qǐng)求,需向那個(gè)對(duì)象“發(fā)送一條消息”。更具體地講,可將消息想象為一個(gè)調(diào)用請(qǐng)求,它調(diào)用的是從屬于目標(biāo)對(duì)象的一個(gè)子例程或函

3、數(shù)。 使用一些預(yù)先定義好的類(lèi)時(shí),我們?cè)诔绦蚶锊捎玫拇a是非常簡(jiǎn)單和直觀的。 5第5頁(yè),共21頁(yè)。1.3 對(duì)象由更小的對(duì)象構(gòu)成(1)許多人認(rèn)為代碼重用是面向?qū)ο蟪绦蛟O(shè)計(jì)提供的最偉大的一種杠桿。為重復(fù)使用一個(gè)類(lèi),最簡(jiǎn)單的辦法是直接使用那個(gè)類(lèi)的對(duì)象。但同時(shí)也能將那個(gè)類(lèi)的一個(gè)對(duì)象置入一個(gè)新類(lèi)。我們把這叫作“創(chuàng)建一個(gè)成員對(duì)象”。新類(lèi)可由任意數(shù)量和類(lèi)的其他對(duì)象構(gòu)成。這個(gè)概念叫作“組合”(也叫“包含”)在現(xiàn)有類(lèi)的基礎(chǔ)上組織一個(gè)新類(lèi)。所以,盡管對(duì)象的概念非常簡(jiǎn)單,但在程序中卻可達(dá)到任意高的復(fù)雜程度。6第6頁(yè),共21頁(yè)。1.3 對(duì)象由更小的對(duì)象構(gòu)成(2)對(duì)象的組合具有極大的靈活性。新類(lèi)的“成員對(duì)象”通常設(shè)為“私

4、有”(Private),這樣我們可在不干擾客戶(hù)代碼的前提下,從容地修改那些成員。也可以在“運(yùn)行期”更改成員,這進(jìn)一步增大了靈活性。由于繼承的重要性,所以在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,它經(jīng)常被重點(diǎn)強(qiáng)調(diào)。作為新加入這一領(lǐng)域的程序員,或許早已先入為主地認(rèn)為“繼承應(yīng)當(dāng)隨處可見(jiàn)”。沿這種思路產(chǎn)生的設(shè)計(jì)將是非常笨拙的,會(huì)大大增加程序的復(fù)雜程度。相反,新建類(lèi)的時(shí)候,首先應(yīng)考慮“組合”對(duì)象;這樣做顯得更加簡(jiǎn)單和靈活。利用對(duì)象的組織,我們的設(shè)計(jì)可保持清爽。7第7頁(yè),共21頁(yè)。1.4 每個(gè)對(duì)象都有其職責(zé)(1)“接口”(Interface)規(guī)定了可對(duì)一個(gè)特定的對(duì)象發(fā)出哪些請(qǐng)求。然而,必須在某個(gè)地方存在著一些代碼,以便滿(mǎn)足

5、這些請(qǐng)求。這些代碼與那些隱藏起來(lái)的數(shù)據(jù)便叫作“隱藏的實(shí)現(xiàn)”。對(duì)象的職責(zé)就是決定如何對(duì)這條消息作出反應(yīng)(執(zhí)行相應(yīng)的代碼)。每個(gè)對(duì)象都有一種模版。類(lèi):具體相同或相似性質(zhì)的對(duì)象的抽象就是類(lèi)。因此,對(duì)象的抽象是類(lèi),類(lèi)的具體化是對(duì)象,也可說(shuō)實(shí)例是對(duì)象。類(lèi)具體屬性和操作。8第8頁(yè),共21頁(yè)。1.4 每個(gè)對(duì)象都有其職責(zé)(2)一個(gè)類(lèi)最重要的特征就是“能將什么消息發(fā)給它?”。 Java 采用三個(gè)顯式關(guān)鍵字以及一個(gè)隱式關(guān)鍵字來(lái)設(shè)置類(lèi)邊界:public,private,protected 以及暗示性的friendly。若未明確指定其他關(guān)鍵字,則默認(rèn)為后者。這些關(guān)鍵字的使用和含義都是相當(dāng)直觀的,它們決定了誰(shuí)能使用后續(xù)

6、的定義內(nèi)容。 9第9頁(yè),共21頁(yè)。1.5 對(duì)象職責(zé)由下屬對(duì)象協(xié)作實(shí)現(xiàn)(1)我們費(fèi)盡心思做出一種類(lèi)后,假如不得不又新建一種類(lèi),令其實(shí)現(xiàn)大致相同的功能,那會(huì)是一件非常令人灰心的事情。但若能利用現(xiàn)成的類(lèi),對(duì)其進(jìn)行“克隆”,再根據(jù)情況進(jìn)行添加和修改,情況就顯得理想多了。“繼承”正是針對(duì)這個(gè)目標(biāo)而設(shè)計(jì)的。但繼承并不完全等價(jià)于克隆。 10第10頁(yè),共21頁(yè)。1.5 對(duì)象職責(zé)由下屬對(duì)象協(xié)作實(shí)現(xiàn)(2)有兩種做法可將新得的衍生類(lèi)與原來(lái)的基礎(chǔ)類(lèi)區(qū)分開(kāi)。第一種做法:為衍生類(lèi)添加新函數(shù)(功能)。一般都是意識(shí)到基礎(chǔ)類(lèi)不能滿(mǎn)足我們的要求。新類(lèi)“類(lèi)似”原類(lèi)第二個(gè)辦法是改變基礎(chǔ)類(lèi)一個(gè)現(xiàn)有函數(shù)的行為。我們將其稱(chēng)作“改善”那個(gè)函

7、數(shù)。只需為衍生類(lèi)的函數(shù)建立一個(gè)新定義即可。我們的目標(biāo)是:“盡管使用的函數(shù)接口未變,但它的新版本具有不同的表現(xiàn)”。新類(lèi)“等價(jià)”原類(lèi)11第11頁(yè),共21頁(yè)。1.5 對(duì)象職責(zé)由下屬對(duì)象協(xié)作實(shí)現(xiàn)(3)由于類(lèi)為“圓”(Circle)的一個(gè)對(duì)象也屬于類(lèi)為“形狀”(Shape)的一個(gè)對(duì)象,所以一個(gè)圓完全能接收形狀消息。這意味著可讓程序代碼統(tǒng)一指揮“形狀”,令其自動(dòng)控制所有符合“形狀”描述的對(duì)象,其中自然包括“圓”。這一特性稱(chēng)為對(duì)象的“可替換性”,是OOP 最重要的概念之一。 若通過(guò)繼承增添了一種新類(lèi),如“三角形”,那么我們?yōu)椤靶螤睢本帉?xiě)的代碼不用改變。所以說(shuō)程序具備了“擴(kuò)展能力” 。 12第12頁(yè),共21頁(yè)

8、。2、從實(shí)例理解面向?qū)ο笤O(shè)計(jì)思想假定我們要設(shè)計(jì)一個(gè)媒體播放器。該媒體播放器目前只支持音頻文件mp3和wav。初步設(shè)計(jì)出來(lái)的播放器可能很簡(jiǎn)單: public class MediaPlayer private void playMp3() System.out.println(Play the mp3 file.); private void playWav() System.out.println(Play the wav file.); public void play(string audioType) switch (audioType.ToLower() case (mp3): pla

9、yMp3(); break; case (wav): playWav(); break; 13第13頁(yè),共21頁(yè)。2、需求變更促使我們改善自然,你會(huì)發(fā)現(xiàn)這個(gè)設(shè)計(jì)非常的糟糕。因?yàn)樗緵](méi)有為未來(lái)的需求變更提供最起碼的擴(kuò)展。當(dāng)你為應(yīng)接不暇的需求變更而焦頭爛額的時(shí)候,你可能更希望讓這份設(shè)計(jì)到它應(yīng)該去的地方,就是桌面的回收站。 仔細(xì)分析這段代碼,它其實(shí)是一種最古老的面向結(jié)構(gòu)的設(shè)計(jì)。如果你要播放的不僅僅是mp3和wav,你會(huì)不斷地增加相應(yīng)地播放方法,然后讓switch子句越來(lái)越長(zhǎng),直至達(dá)到你視線(xiàn)看不到的地步。好吧,我們先來(lái)體驗(yàn)對(duì)象的精神。根據(jù)OOP的思想,我們應(yīng)該把mp3和wav看作是一個(gè)獨(dú)立的對(duì)象。那

10、么是這樣嗎?14第14頁(yè),共21頁(yè)。2、建立對(duì)象,統(tǒng)一接口public class MP3 public void play() System.out.println(Play the mp3 file.); public class WAV public void play()System.out.println(Play the wav file.); 你已經(jīng)知道怎么建立對(duì)象了。更可喜的是,你在不知不覺(jué)中應(yīng)用了重構(gòu)的方法,把原來(lái)那個(gè)垃圾設(shè)計(jì)中的方法名字改為了統(tǒng)一的play()方法。但似乎你并沒(méi)有擊中要害,以現(xiàn)在的方式去更改MediaPlayer的代碼,實(shí)質(zhì)并沒(méi)有多大的變化。15第15頁(yè),共

11、21頁(yè)。2、引入繼承,為了?既然mp3和wav都屬于音頻文件,他們都具有音頻文件的共性,為什么不為它們建立一個(gè)共同的父類(lèi)呢? public class AudioMedia public void play() System.out.println(Play the AudioMedia file.); 現(xiàn)在我們引入了繼承的思想,OOP也算是象模象樣了。得意之余,再認(rèn)真分析下,其實(shí)在現(xiàn)實(shí)生活中,我們播放的只會(huì)是某種具體類(lèi)型的音頻文件,因此這個(gè)AudioMedia類(lèi)并沒(méi)有實(shí)際使用的情況。對(duì)應(yīng)在設(shè)計(jì)中,就是:這個(gè)類(lèi)永遠(yuǎn)不會(huì)被實(shí)例化。所以,還得動(dòng)一下手術(shù),將其改為抽象類(lèi)。16第16頁(yè),共21頁(yè)。2、

12、出現(xiàn)類(lèi)層次(繼承+組合)好了,現(xiàn)在的代碼有點(diǎn)OOP的感覺(jué)了: public abstract class AudioMedia public abstract void play(); public class MP3 extends AudioMedia public void Play() System.out.println(Play the mp3 file.); public class WAV extends AudioMedia public void Play() System.out.println(Play the wav file.); public class Medi

13、aPlayer public void play(AudioMedia media) media.play(); 17第17頁(yè),共21頁(yè)。2、無(wú)止境的發(fā)展看看現(xiàn)在的設(shè)計(jì),保證了類(lèi)的最小化原則,更利于擴(kuò)展(到這里,你會(huì)發(fā)現(xiàn)play方法名改得多有必要)。 即使你現(xiàn)在又增加了對(duì)WMA文件的播放,只需要設(shè)計(jì)WMA類(lèi),并繼承AudioMedia,重寫(xiě)play方法就可以了,MediaPlayer類(lèi)對(duì)象的play方法根本不用改變。是不是到此就該畫(huà)上圓滿(mǎn)的句號(hào)呢?然后刁鉆的客戶(hù)是永遠(yuǎn)不會(huì)滿(mǎn)足的,他們希望你的媒體播放器能夠支持視頻文件。你又該痛苦了,因?yàn)橐曨l文件和音頻文件有很多不同的地方,你可不能偷懶,讓視頻文

14、件對(duì)象認(rèn)音頻文件作父親啊。你需要為視頻文件設(shè)計(jì)另外的類(lèi)對(duì)象了,假設(shè)我們支持RM和MPEG格式的視頻:18第18頁(yè),共21頁(yè)。2、追加一個(gè)繼承層次public abstract class VideoMedia public abstract void Play(); public class RM extends VideoMedia public void Play() System.out.println(Play the rm file.); public class MPEG extends VideoMedia public void Play() System.out.printl

15、n(Play the mpeg file.); 糟糕的是,你不能一勞永逸地享受原有的MediaPlayer類(lèi)了。因?yàn)槟阋シ诺腞M文件并不是AudioMedia的子類(lèi)。19第19頁(yè),共21頁(yè)。2、接口可是個(gè)利器不過(guò)不用著急,因?yàn)榻涌谶@個(gè)利器你還沒(méi)有用上。雖然視頻和音頻格式不同,別忘了,他們都是媒體中的一種,很多時(shí)候,他們有許多相似的功能,比如播放。根據(jù)接口的定義,你完全可以將相同功能的一系列對(duì)象實(shí)現(xiàn)同一個(gè)接口:public interface IMedia abstract void play(); public abstract class AudioMedia implements IMedia public abstract void play(); public abstract class VideoMedia implements IMedia public abstract void play(); 再更改一下MediaPlayer的設(shè)計(jì)就OK了: public class MediaPlayer public void play(IMedia media) media.play(); 20第20頁(yè),共21頁(yè)。2、總結(jié),思考從MediaPlayer類(lèi)的演變,我們可以得出這樣一個(gè)結(jié)論:在調(diào)用類(lèi)對(duì)象的屬性和方法時(shí),盡量避免將具

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論