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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、。2、從實(shí)例理解面向?qū)ο笤O(shè)計(jì)思想假定我們要設(shè)計(jì)一個(gè)媒體播放器。該媒體播放器目前只支持音頻文件mp3和wav。初步設(shè)計(jì)出來的播放器可能很簡單: 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頁,共21頁。2、需求變更促使我們改善自然,你會(huì)發(fā)現(xiàn)這個(gè)設(shè)計(jì)非常的糟糕。因?yàn)樗緵]有為未來的需求變更提供最起碼的擴(kuò)展。當(dāng)你為應(yīng)接不暇的需求變更而焦頭爛額的時(shí)候,你可能更希望讓這份設(shè)計(jì)到它應(yīng)該去的地方,就是桌面的回收站。 仔細(xì)分析這段代碼,它其實(shí)是一種最古老的面向結(jié)構(gòu)的設(shè)計(jì)。如果你要播放的不僅僅是mp3和wav,你會(huì)不斷地增加相應(yīng)地播放方法,然后讓switch子句越來越長,直至達(dá)到你視線看不到的地步。好吧,我們先來體驗(yàn)對象的精神。根據(jù)OOP的思想,我們應(yīng)該把mp3和wav看作是一個(gè)獨(dú)立的對象。那

10、么是這樣嗎?14第14頁,共21頁。2、建立對象,統(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)知道怎么建立對象了。更可喜的是,你在不知不覺中應(yīng)用了重構(gòu)的方法,把原來那個(gè)垃圾設(shè)計(jì)中的方法名字改為了統(tǒng)一的play()方法。但似乎你并沒有擊中要害,以現(xiàn)在的方式去更改MediaPlayer的代碼,實(shí)質(zhì)并沒有多大的變化。15第15頁,共

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

12、出現(xiàn)類層次(繼承+組合)好了,現(xiàn)在的代碼有點(diǎn)OOP的感覺了: 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頁,共21頁。2、無止境的發(fā)展看看現(xiàn)在的設(shè)計(jì),保證了類的最小化原則,更利于擴(kuò)展(到這里,你會(huì)發(fā)現(xiàn)play方法名改得多有必要)。 即使你現(xiàn)在又增加了對WMA文件的播放,只需要設(shè)計(jì)WMA類,并繼承AudioMedia,重寫play方法就可以了,MediaPlayer類對象的play方法根本不用改變。是不是到此就該畫上圓滿的句號呢?然后刁鉆的客戶是永遠(yuǎn)不會(huì)滿足的,他們希望你的媒體播放器能夠支持視頻文件。你又該痛苦了,因?yàn)橐曨l文件和音頻文件有很多不同的地方,你可不能偷懶,讓視頻文

14、件對象認(rèn)音頻文件作父親啊。你需要為視頻文件設(shè)計(jì)另外的類對象了,假設(shè)我們支持RM和MPEG格式的視頻:18第18頁,共21頁。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類了。因?yàn)槟阋シ诺腞M文件并不是AudioMedia的子類。19第19頁,共21頁。2、接口可是個(gè)利器不過不用著急,因?yàn)榻涌谶@個(gè)利器你還沒有用上。雖然視頻和音頻格式不同,別忘了,他們都是媒體中的一種,很多時(shí)候,他們有許多相似的功能,比如播放。根據(jù)接口的定義,你完全可以將相同功能的一系列對象實(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頁,共21頁。2、總結(jié),思考從MediaPlayer類的演變,我們可以得出這樣一個(gè)結(jié)論:在調(diào)用類對象的屬性和方法時(shí),盡量避免將具

溫馨提示

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

評論

0/150

提交評論