抽象類和接口_第1頁
抽象類和接口_第2頁
抽象類和接口_第3頁
抽象類和接口_第4頁
抽象類和接口_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八章抽象類和接口抽象類和接口第一單元第1頁/共26頁本章相關(guān)學(xué)習(xí)資源抽象類和接口專題階段練習(xí)汽車租賃專題使用Java實現(xiàn)面向?qū)ο缶幊痰?章 抽象類和接口學(xué)習(xí)平臺學(xué)習(xí)平臺“Java 面向?qū)ο竺嫦驅(qū)ο蟆闭n程課程學(xué)生用書學(xué)生用書第2頁/共26頁預(yù)習(xí)檢查定義抽象類和抽象方法的關(guān)鍵字是什么?定義抽象類和抽象方法的關(guān)鍵字是什么?abstractabstract定義接口的語法是什么?定義接口的語法是什么?public interface public interface 接口名接口名 /接口成員接口成員 普通方法和抽象方法的區(qū)別普通方法和抽象方法的區(qū)別普通方法必須要有方法體,抽象方法不能有方法體(大括號也

2、沒有普通方法必須要有方法體,抽象方法不能有方法體(大括號也沒有););抽象方法抽象方法只能存在于抽象只能存在于抽象類類/ /接口中,用接口中,用abstractabstract修飾,訪問修飾符不修飾,訪問修飾符不能用能用privateprivate。抽象類和普通類有什么區(qū)別?抽象類和普通類有什么區(qū)別?抽象類要用抽象類要用abstractabstract修飾修飾;普通;普通類可以實例化,抽象類不能實例化;類可以實例化,抽象類不能實例化;抽象類體現(xiàn)的的是一種模板模式的設(shè)計。抽象類體現(xiàn)的的是一種模板模式的設(shè)計。提問提問第3頁/共26頁本章任務(wù)模擬實現(xiàn)模擬實現(xiàn)“憤怒的小鳥憤怒的小鳥”游戲游戲第4頁/共

3、26頁抽象類的定義和使用抽象類的定義和使用理解接口概念理解接口概念理解面向?qū)ο笤O(shè)計原則理解面向?qū)ο笤O(shè)計原則理解抽象類和接口的優(yōu)勢理解抽象類和接口的優(yōu)勢本章目標(biāo)接口的定義和使用接口的定義和使用點點重重理解抽象類概念理解抽象類概念點點難難點點重重第5頁/共26頁講解:為什么使用抽象方法和抽象類交通工具交通工具公交車類方法: 行駛(公路駕駛)地鐵類方法: 行駛(地下軌道)自行車類方法: 行駛(人力蹬)實現(xiàn)父類行駛方實現(xiàn)父類行駛方法有意義嗎?法有意義嗎?每個子每個子類有自己獨特類有自己獨特的行駛方法的行駛方法交通工具類(抽象類)交通工具類方法:行駛抽象方法:行駛第6頁/共26頁問題:問題:3 3種種交

4、通工具,都交通工具,都有自己的行駛方法,有自己的行駛方法,如何如何設(shè)計類結(jié)構(gòu)?設(shè)計類結(jié)構(gòu)?串講:對比普通方法和抽象方法對比普通方法與抽象方法對比普通方法與抽象方法public void show() System.out.println(hello);public abstract void show();區(qū)別區(qū)別普通方法必須要有方法體(至少包含一對大括號),抽象方法不能有方法體(大括號也沒有)抽象方法要用abstract修飾,訪問修飾符不能用private抽象方法只能存在于抽象類/接口中第7頁/共26頁抽象方法抽象方法定義定義 非非private訪問修飾符訪問修飾符 abstract 返回返

5、回值值類型類型 方法名方法名(參數(shù)列表參數(shù)列表) ;串講:對比普通類和抽象類對比普通類與抽象類對比普通類與抽象類public class PersonPerson p = new Person();public abstract class PersonPerson p = new Person();區(qū)別區(qū)別抽象類要用abstract修飾普通類可以實例化,抽象類不能實例化(即不能使用new創(chuàng)建對象)抽象類通過其子類實例化,而子類需要覆蓋掉抽象類中所有的抽象方法后才可以創(chuàng)建對象,否則該子類也是抽象類。簡單的說,抽象類是一個不能實例化的類不能實例化的類,它可以具有抽象方法或者普通方法,也可以有構(gòu)造

6、方法。第8頁/共26頁代碼有沒有問題?代碼有沒有問題?串講:抽象類的應(yīng)用需求描述需求描述模擬“憤怒的小鳥”游戲中各種鳥的行為問題問題抽象類鳥飛行:彈射-飛叫:嗷-?。ǔ橄蠓椒ǎ┕舴至养B攻擊:分裂攻擊火箭鳥攻擊:加速沖撞分析分析使用抽象類定義鳥類飛行和叫為抽象類的普通方法攻擊為抽象類的抽象方法在子類中實現(xiàn)攻擊方法演示示例演示示例1 1:抽象類的應(yīng)用抽象類的應(yīng)用第9頁/共26頁上機練習(xí)需求說明需求說明實現(xiàn)某公司各種崗位(經(jīng)理、銷售人員、普通員工)的員工實現(xiàn)某公司各種崗位(經(jīng)理、銷售人員、普通員工)的員工薪水計算。經(jīng)理的薪水為基本工資薪水計算。經(jīng)理的薪水為基本工資+ +獎金,銷售人員的薪水為獎金,

7、銷售人員的薪水為基本工資基本工資+ +銷售量銷售量* *每件提成,每件提成,普通普通員工只有基本工資;員工只有基本工資;要求要求輸出不同崗位各一名員工的輸出不同崗位各一名員工的工資,使用抽象類實現(xiàn);工資,使用抽象類實現(xiàn);分析分析定義員工抽象類,具有姓名、基本工資的屬性和計算薪水的定義員工抽象類,具有姓名、基本工資的屬性和計算薪水的抽象方法抽象方法定義子類:經(jīng)理類、銷售人員類、普通員工類,分別繼承員定義子類:經(jīng)理類、銷售人員類、普通員工類,分別繼承員工抽象類,定義各自的屬性,重寫計算薪水的方法工抽象類,定義各自的屬性,重寫計算薪水的方法定義測試類,包含定義測試類,包含輸出員工薪水輸出員工薪水的靜

8、態(tài)方法,參數(shù)為員工對的靜態(tài)方法,參數(shù)為員工對象象(抽象父類的引用指向子類的對象,可以實現(xiàn)多態(tài))(抽象父類的引用指向子類的對象,可以實現(xiàn)多態(tài))完成時間完成時間:20分鐘分鐘共性問題集中講解共性問題集中講解練習(xí)練習(xí)1 1第10頁/共26頁串講:抽象類的優(yōu)勢抽象類可以將已經(jīng)實現(xiàn)的方法提供給其子類使用,使代碼可以被復(fù)用抽象類中的抽象方法在子類中重寫,保證了子類還具有自身的獨特性例如:鳥的飛行和叫的方法,不需在子類重復(fù)實現(xiàn)例如:每個鳥都有自己獨特的攻擊行為通過抽象類指向其子類的對象,可以實現(xiàn)多態(tài)第11頁/共26頁串講:抽象類的體現(xiàn)-模板模式Template編寫一個抽象父類編寫一個抽象父類, ,該父類提供

9、了多個子類的通用方法該父類提供了多個子類的通用方法, ,并把一個或多個抽象方法留給子類去實現(xiàn)并把一個或多個抽象方法留給子類去實現(xiàn), ,這就是這就是模板設(shè)模板設(shè)計計模式模式抽象類是多個具體子類抽象出來的父類,具有高層次的抽象性;以抽象類作為子類的模板可以避免子類設(shè)計的隨意性;抽象類作為多個子類的通用模板抽象類作為多個子類的通用模板, ,子類在抽象類的基礎(chǔ)上子類在抽象類的基礎(chǔ)上進(jìn)行擴展進(jìn)行擴展, ,但總體但總體上大致保留上大致保留抽象父類抽象父類的行為方式的行為方式; ;模板模板模式應(yīng)用的簡單規(guī)則模式應(yīng)用的簡單規(guī)則: :抽象父類可以只定義需要使用的某些方法,其余留給子類去實現(xiàn);父類提供的方法只是定

10、義了一個通用算法,其具體實現(xiàn)必須依賴子類的輔助;判斷對錯判斷對錯抽象類中只能定義抽象方法。抽象類中不能定義構(gòu)造方法。抽象方法可以同時是靜態(tài)方法。抽象類中可以沒有抽象方法。聲明抽象類和抽象方法都使用abstract關(guān)鍵字。抽象類不能實例化。抽象類中可以有靜態(tài)方法。小結(jié)提問提問第13頁/共26頁串講:理解接口USBUSB接口其實并不是我們所看到接口其實并不是我們所看到的這的這些些USBUSB插槽插槽, ,而是這些而是這些插槽所遵循插槽所遵循的的標(biāo)準(zhǔn)標(biāo)準(zhǔn)規(guī)范規(guī)范; ;我們所看到的插槽只是我們所看到的插槽只是根根據(jù)據(jù)USBUSB規(guī)范設(shè)計出來的實例規(guī)范設(shè)計出來的實例而已而已; ;對于不同類型的對于不同類

11、型的USBUSB設(shè)備而言設(shè)備而言, ,他們他們各自的各自的USBUSB插口都插口都需要需要遵循同一遵循同一個規(guī)個規(guī)范范, ,遵守這個規(guī)范就可以保證遵守這個規(guī)范就可以保證插入插入USBUSB插槽插槽的設(shè)備能與主板正常通信的設(shè)備能與主板正常通信; ;對于同對于同一塊主板一塊主板上的多個上的多個USBUSB插槽插槽, ,它們它們有相同的數(shù)據(jù)交換方式有相同的數(shù)據(jù)交換方式, ,相同的相同的實現(xiàn)細(xì)節(jié)實現(xiàn)細(xì)節(jié), ,可看作是可看作是同一個類的不同同一個類的不同實例實例; ;第14頁/共26頁生活中的接口是指某些企業(yè)和組織等制定的一種約生活中的接口是指某些企業(yè)和組織等制定的一種約定定或標(biāo)準(zhǔn)或標(biāo)準(zhǔn)比如USB接口串

12、講:理解接口抽象類是從多個類中抽象出來的模板,若要將這種抽象進(jìn)抽象類是從多個類中抽象出來的模板,若要將這種抽象進(jìn)行得更徹底,行得更徹底,就就需要需要用到用到一種特殊的一種特殊的“抽象類抽象類” 接口接口;JavaJava中的接口提供的也是一種規(guī)范,它中的接口提供的也是一種規(guī)范,它規(guī)定了一規(guī)定了一個類個類必須必須做做什么什么, ,而而不關(guān)心這個類到底怎么做。不關(guān)心這個類到底怎么做。public interface 接口名接口名 extends 父接口父接口1,父接口父接口2 /抽象方法抽象方法語法語法public 類名類名 implements 接口接口 / 實現(xiàn)接口定義的方法實現(xiàn)接口定義的方法

13、 / 普通方法普通方法 演示示例演示示例2 2:使用接口描述:使用接口描述USBUSB注意注意第15頁/共26頁接口沒有構(gòu)造方法,不能實例化;接口只能繼承接口,不能繼承類;接口里沒有普通方法,都是抽象方法,默認(rèn)修飾符是public abstractpublic abstract;接口里的字段都是全局常量,默認(rèn)修飾符是public static finalpublic static final;一個類一個類如果要如果要實現(xiàn)一個接口,實現(xiàn)一個接口,則則必須實現(xiàn)必須實現(xiàn)該該接口定義中接口定義中的的所有所有方方法,否則該類只能定義為抽象類法,否則該類只能定義為抽象類通常在通常在接口名前加上字母接口名前

14、加上字母I,I,用于區(qū)分類和接口用于區(qū)分類和接口同時用同時用static和和final修飾的修飾的域域(即編譯器常量即編譯器常量)使用大寫字母表使用大寫字母表示,示,每個每個單詞用下劃線隔開單詞用下劃線隔開串講:final關(guān)鍵字根據(jù)根據(jù)上下文環(huán)境上下文環(huán)境,finalfinal關(guān)鍵字存在關(guān)鍵字存在著細(xì)微的區(qū)別,著細(xì)微的區(qū)別,但通常指的是但通常指的是“這是無法改變這是無法改變的的”。finalfinal可以修飾類,方法,變量。可以修飾類,方法,變量。final修飾的類不可以被繼承。final修飾的方法不可以被重寫。final修飾的變量是一個常量。只能被賦值一次。對基本類型,使用fianl,不能改

15、變的是它的數(shù)值;對引用類型,使用fianl,不能改變的是它的引用,而對象本身是可以修改的。一旦一個final引用被初始化指向一個對象,這個引用將不能在指向其他對象;對于static final修飾的全局常量,必須在聲明的同時賦初值;串講:對比抽象類和接口對比抽象類與接口對比抽象類與接口public abstract class Person/抽象方法抽象方法/普通方法普通方法public interface Person /抽象方法抽象方法區(qū)別區(qū)別抽象類使用abstract聲明,接口使用interface聲明抽象類可以包含屬性、抽象方法(必須使用abstract關(guān)鍵字)、普通方法和構(gòu)造方法,也

16、可以不含抽象方法接口只能包含抽象方法(無須使用abstract關(guān)鍵字)和常量接口和抽象類一樣,不能實例化接口和抽象類一樣,不能實例化抽象類與接口有什么區(qū)別?抽象類與接口有什么區(qū)別?提問提問第17頁/共26頁講解:認(rèn)識抽象類的局限性 實現(xiàn)實現(xiàn)“憤怒的小鳥憤怒的小鳥”游戲中鳥叫的行為游戲中鳥叫的行為抽象類鳥飛行:彈射-飛叫:嗷-!攻擊(抽象方法)分裂鳥攻擊:分裂攻擊火箭鳥攻擊:加速沖撞紅色鳥攻擊:普通攻擊叫:喳喳炸彈鳥攻擊:爆炸攻擊叫:喳喳胖子鳥攻擊:扔蛋攻擊叫:不叫代碼冗余,復(fù)用度差代碼冗余,復(fù)用度差第18頁/共26頁講解:使用接口優(yōu)化程序設(shè)計將鳥叫的行為定義為接口 實現(xiàn)鳥叫接口輸出各種具體的鳥

17、叫聲 將鳥叫行為作為抽象鳥類的一個屬性 能不能用接口來實現(xiàn)鳥叫的行為,從而既避免能不能用接口來實現(xiàn)鳥叫的行為,從而既避免代碼冗余,又不影響擴展性?代碼冗余,又不影響擴展性?問題問題分析分析 演示示例演示示例3 3:使用接口優(yōu)化程序設(shè)計:使用接口優(yōu)化程序設(shè)計第19頁/共26頁接口規(guī)定了實現(xiàn)類接口規(guī)定了實現(xiàn)類里必須提供的里必須提供的方法,體現(xiàn)了方法,體現(xiàn)了規(guī)范規(guī)范和和實現(xiàn)的分離,增強實現(xiàn)的分離,增強了系統(tǒng)了系統(tǒng)的擴展性和可維護性的擴展性和可維護性; ;上機練習(xí)需求說明需求說明電視、風(fēng)扇、冰箱等各種電器要想工作必須提供電源,使用接口模擬電器獲得電源后進(jìn)行工作分析分析定義電源的接口,具有供電的方法定義

18、類:電視、風(fēng)扇和冰箱類,分別實現(xiàn)電源接口定義測試類,包含電器開始工作的方法,參數(shù)為電器對象(接口的引用指向?qū)崿F(xiàn)類的對象,可以實現(xiàn)多態(tài))完成時間完成時間:20分鐘分鐘共性問題集中講解共性問題集中講解練習(xí)練習(xí)2 2第20頁/共26頁/* 手機工廠手機工廠 */class PhoneFactory public static ICellPhone getInstance(String type)ICellPhone p = null;if (samsung.equalsIgnoreCase(type) p = new SAMSUNG(); else if (iphone.equalsIgnoreCa

19、se(type)p = new IPhone();return p;public static void main(String args) /ICellPhone p = new SAMSUNG();ICellPhone p = PhoneFactory.getInstance(samsung);p.sendMsg();串講:簡單工廠模式SimpleFactory/手機標(biāo)準(zhǔn)手機標(biāo)準(zhǔn)interface ICellPhone void sendMsg();/* 三星三星手機手機 */class SAMSUNG implements ICellPhone public void sendMsg()

20、 /* IPhone手機手機 */class IPhone implements ICellPhonepublic void sendMsg() 屏蔽不同子類實現(xiàn)的差異,提高代碼的屏蔽不同子類實現(xiàn)的差異,提高代碼的可擴展性可擴展性和和可維護性可維護性串講:實現(xiàn)多個接口一個類只能繼承一個父類,但能同時實現(xiàn)多個接一個類只能繼承一個父類,但能同時實現(xiàn)多個接口。口。class 類名類名 extends 父類名父類名 implements 接口接口1,接口接口2, /類的成員類的成員語法語法一個類可以同時一個類可以同時繼承類和實現(xiàn)繼承類和實現(xiàn)接口,但接口,但是是extends必須位于必須位于implem

21、ents之前之前一個類實現(xiàn)多個接口,一個類實現(xiàn)多個接口,必須必須實現(xiàn)每個接實現(xiàn)每個接口中口中的方法,否則只能定義為抽象類的方法,否則只能定義為抽象類第22頁/共26頁接口可以繼承接口嗎?如果可以,能繼承多個接口可以繼承接口嗎?如果可以,能繼承多個嗎?嗎?接口接口可以實現(xiàn)可以實現(xiàn)接口嗎?接口嗎?接口可以繼承一個或多個接口接口可以繼承一個或多個接口;接口不能實現(xiàn)接口。接口不能實現(xiàn)接口。提問提問串講:實現(xiàn)多個接口示例示例某人既是軟件工程師,又是慈善家,該如何實現(xiàn)?某人既是軟件工程師,又是慈善家,該如何實現(xiàn)?分析分析定義人類作為抽象父類,包含人的基本屬性和行為定義編程接口,擁有編程能力定義慈善接口,擁

22、有做慈善能力定義一個子類,繼承人類,同時實現(xiàn)編程接口和慈善接口演示示例演示示例4 4:實現(xiàn)多個接口實現(xiàn)多個接口第23頁/共26頁上機練習(xí)需求說明需求說明在職研究生既要學(xué)習(xí),還要工作,使用實現(xiàn)多個接口的方式定義研究生類分析分析定義人類作為抽象父類,包含人的基本屬性和行為定義學(xué)習(xí)接口,擁有學(xué)習(xí)能力定義工作接口,擁有工作能力定義研究生類,繼承人類,同時實現(xiàn)學(xué)習(xí)接口和工作接口完成時間完成時間:20分鐘分鐘共性問題集中講解共性問題集中講解練習(xí)練習(xí)3 3第24頁/共26頁小結(jié):接口第25頁/共26頁JavaJava中的接口提供了一種規(guī)范,規(guī)定一個中的接口提供了一種規(guī)范,規(guī)定一個類必須做什么類必須做什么,

23、, 使得使得所有實現(xiàn)該接口的類所有實現(xiàn)該接口的類在形式上在形式上都都能能保持保持一致;一致;接接口里的成員包括口里的成員包括( (主要是前兩個主要是前兩個) ):全局常量公共的抽象方法內(nèi)部類(包括內(nèi)部類,內(nèi)部接口,內(nèi)部枚舉類);接口不能創(chuàng)建實例,但是接口不能創(chuàng)建實例,但是可以用來聲明可以用來聲明引引用用類型變量類型變量。此時,引用類型的變量必須指向其實現(xiàn)類的對象。例:IStudent s = new StudentImpl();小結(jié):接口和抽象類相同點相同點: :都位于繼承的頂端,用于被其他類實現(xiàn)或繼承;自身不能實例化,都是依靠對象多態(tài)性,通過實現(xiàn)類/子類進(jìn)行對象實例化;都可以包含抽象方法,其

24、實現(xiàn)類/子類都必須重寫這些抽象方法;區(qū)別區(qū)別: :抽象類中可以含有成員變量,接口中只有全局常量;抽象類可以含有構(gòu)造方法,可以為部分方法提供實現(xiàn),避免子類重復(fù)實現(xiàn)這些方法,提高代碼的重用性;接口只能包含抽象方法;一個類只能繼承一個直接父類(可以是抽象類),卻可以實現(xiàn)多個接口;(接口彌補了Java單繼承的局限)二者的選用二者的選用: :優(yōu)先使用接口,盡量避免使用抽象類;需要定義子類的行為,又要為子類提供共性功能時才考慮選用抽象類;串講:適配器模式Adapter有一有一個現(xiàn)成個現(xiàn)成的類的類/ /接口,接口,但是但是它不完全它不完全符合你的需求符合你的需求, ,咋辦?咋辦?比如窗體有變大、變小、關(guān)閉的

25、行為,但是我現(xiàn)在只需要關(guān)閉行為;interface IWindowvoid max();void min();void close();abstract class WindowAdapter implements IWindowpublic void max()public void min()public void close()class MyWindow extends WindowAdapter public void close()System.out.print(自己關(guān)閉窗口);默認(rèn)適配器模式:在默認(rèn)適配器模式:在接口和具體實現(xiàn)接口和具體實現(xiàn)類類之間添加之間添加一個抽象類一個抽象

26、類,用,用抽象類去空實抽象類去空實現(xiàn)目標(biāo)接口的所有現(xiàn)目標(biāo)接口的所有方法,具體方法,具體的實現(xiàn)類的實現(xiàn)類只需要覆蓋其需要完成的方法即只需要覆蓋其需要完成的方法即可???。適配器模式的其他用法可參考:適配器模式的其他用法可參考:http:/ 性:性: 都是不斷抽取出來的抽象的概念,都不能實例化都是不斷抽取出來的抽象的概念,都不能實例化區(qū)別區(qū)別 1:抽象類使用抽象類使用abstract聲明;聲明;接口使用接口使用interface聲明;聲明;區(qū)別區(qū)別 2:抽象類體現(xiàn)繼承關(guān)系,是抽象類體現(xiàn)繼承關(guān)系,是 is a 關(guān)系,一個類只關(guān)系,一個類只能單繼承;能單繼承;接口體現(xiàn)實現(xiàn)關(guān)系,是接口體現(xiàn)實現(xiàn)關(guān)系,是 l

27、ike a關(guān)系,一個類可以關(guān)系,一個類可以多實現(xiàn);多實現(xiàn);區(qū)別區(qū)別 3:抽象類可以含有成員變量;抽象類可以含有成員變量;接口中只有全局常量;接口中只有全局常量;區(qū)別區(qū)別 4:抽象類中可以定義構(gòu)造方法,也可定義抽象方法,抽象類中可以定義構(gòu)造方法,也可定義抽象方法,供子類重寫,或者定義非抽象方法,供子類直接供子類重寫,或者定義非抽象方法,供子類直接使用;使用;接口的方法都是抽象方法,接口中的成員都有固接口的方法都是抽象方法,接口中的成員都有固定修飾符;定修飾符;串講:面向?qū)ο笫裁词敲嫦驅(qū)ο笫裁词敲嫦驅(qū)ο髮ο笫侨藗円M(jìn)行研究的任何事物,從最簡單的整數(shù)到復(fù)雜的飛機等均可看作對象。它不僅能表示具體的事物

28、,還能表示抽象的規(guī)則、計劃或事件(回憶:面向?qū)ο笕筇匦??)對象具有狀態(tài),一個對象用數(shù)據(jù)值來描述它的狀態(tài)。對象還有操作,用于改變對象的狀態(tài)。對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,將數(shù)據(jù)和操作封裝于其中面向?qū)ο螅∣bject Oriented,簡稱OO)就是將現(xiàn)實世界的事物抽象成對象,現(xiàn)實世界中的關(guān)系抽象成類、繼承,幫助人們實現(xiàn)現(xiàn)實世界轉(zhuǎn)換成系統(tǒng)模型的一種軟件開發(fā)方法。第29頁/共26頁串講:面向?qū)ο竺嫦驅(qū)ο笫窍鄬γ嫦蜻^程而言面向?qū)ο笫窍鄬γ嫦蜻^程而言面向?qū)ο蠛兔嫦蜻^程都是一種思想面向?qū)ο蠛兔嫦蜻^程都是一種思想面向過程面向過程強調(diào)的是功能行為面向?qū)ο竺嫦驅(qū)ο髮⒐δ芊庋b進(jìn)對象,強調(diào)的是具備了功能的對象。面向

29、對象是基于面向過程的。面向?qū)ο笫腔诿嫦蜻^程的。串講:面向?qū)ο蟮奶攸c是一種符合人們思考習(xí)慣的思想是一種符合人們思考習(xí)慣的思想可以將復(fù)雜的事情簡單化可以將復(fù)雜的事情簡單化將程序員從執(zhí)行者轉(zhuǎn)換成了指揮者將程序員從執(zhí)行者轉(zhuǎn)換成了指揮者完成需求時:完成需求時: 先要去找具有所需的功能的對象來用。如果該對象不存在,那么創(chuàng)建一個具有所需功能的對象。這樣簡化開發(fā)并提高復(fù)用。串講:面向?qū)ο蠓治?、設(shè)計、編程面向?qū)ο蠓治觯嫦驅(qū)ο蠓治觯∣OAOOA,Object Oriented AnalysisObject Oriented Analysis)其實就是找出對象之間的關(guān)系。UML(Unified Modeling

30、 LanguageUML(Unified Modeling Language,統(tǒng)一建模語言),統(tǒng)一建模語言)是面向?qū)ο蠹夹g(shù)領(lǐng)域內(nèi)占主導(dǎo)地位的標(biāo)準(zhǔn)建模語言面向?qū)ο竺嫦驅(qū)ο笤O(shè)計(設(shè)計(OODOOD,Object Oriented Object Oriented DesignDesign)其實就是在管理和維護對象之間的關(guān)系。面向?qū)ο缶幊蹋嫦驅(qū)ο缶幊蹋∣OPOOP,Object OrientedObject Oriented ProgrammingProgramming)其實就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。串講:面向?qū)ο蟮脑O(shè)計原則開放封閉原則開放封閉原則Open-Closed Prin

31、ciple,OCP里氏代換里氏代換原則原則Liskov Substitution Principle,LSP依賴倒轉(zhuǎn)依賴倒轉(zhuǎn)原則原則Dependence Inversion Principle,DIP合成合成/ /聚合復(fù)用聚合復(fù)用原則原則Composite/Aggregate Reuse Principle,CARP迪米特迪米特法則法則Law of Demeter,LoD接口隔離接口隔離原則原則Interface Segregation Principle,ISP單一單一職責(zé)職責(zé)原則原則Single Responsibility Principle,SRP第33頁/共26頁面向?qū)ο笤O(shè)計的基石面

32、向?qū)ο笤O(shè)計的基石手段和手段和工具工具串講:面向?qū)ο蟮脑O(shè)計原則開放開放封閉封閉原則(簡稱開原則(簡稱開- -閉原則)閉原則)定義定義:一個軟件實體如類、模塊和函數(shù)應(yīng)該先用抽象構(gòu)建框架,再用實現(xiàn)擴展細(xì)節(jié)。即對擴展開放,對修改關(guān)閉。問題由來問題由來:在軟件的生命周期內(nèi),因為變化、升級和維護等原因需要對軟件原有代碼進(jìn)行修改時,可能會給舊代碼中引入錯誤,也可能會使我們不得不對整個功能進(jìn)行重構(gòu),并且需要重新測試原有代碼。解決方案解決方案:當(dāng)軟件需要變化時,盡量通過擴展軟件實體的行為來實現(xiàn)變化,而不是通過修改已有的代碼來實現(xiàn)變化。在面向?qū)ο缶幊讨?,通過抽象類及接口,規(guī)定了具體類的特征作為抽象層,相對穩(wěn)定,不

33、需更改,從而滿足“對修改關(guān)閉”;而從抽象類導(dǎo)出的具體類可以改變系統(tǒng)的行為,從而滿足“對擴展開放”。第34頁/共26頁串講:面向?qū)ο蟮脑O(shè)計原則里氏里氏代換原則代換原則(亦稱里(亦稱里氏氏替換替換)定義定義:所有引用基類的地方必須能透明地使用其子類的對象。問題由來問題由來:有一功能P1,由類A完成。現(xiàn)需要將功能P1進(jìn)行擴展,擴展后的功能為P,其中P由原有功能P1與新功能P2組成。新功能P由類A的子類B來完成,則子類B在完成新功能P2的同時,有可能會導(dǎo)致原有功能P1發(fā)生故障。解決方案解決方案:類B繼承類A時,除添加新的方法完成新增功能P2外,盡量不要重寫父類A的方法,也盡量不要重載父類A的方法。里氏

34、替換原則通俗的來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。它包含以下3層含義:子類可以重寫父類的抽象方法,但不能重寫父類的非抽象方法。子類中可以增加自己特有的方法。當(dāng)子類的方法實現(xiàn)父類的抽象方法時,方法的返回值類型要比父類更嚴(yán)格。第35頁/共26頁串講:面向?qū)ο蟮脑O(shè)計原則依賴依賴倒轉(zhuǎn)原則倒轉(zhuǎn)原則( (亦稱依賴倒置亦稱依賴倒置) )定義定義:高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。即針對接口編程,不依賴于具體實現(xiàn)。問題由來問題由來:類A直接依賴類B,假如要將類A改為依賴類C,則必須通過修改類A的代碼來達(dá)成。這種場景下,類A一般是高層

35、模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯;類B和類C是低層模塊,負(fù)責(zé)基本的原子操作;假如修改類A,會給程序帶來不必要的風(fēng)險。解決方案解決方案:將類A修改為依賴接口I,類B和類C各自實現(xiàn)接口I,類A通過接口I間接與類B或者類C發(fā)生聯(lián)系,則會大大降低修改類A的幾率。在實際編程中,我們一般需要做到如下3點:底層模塊盡量都要有抽象類或接口,或者兩者都有。變量的聲明類型盡量是抽象類或接口。使用繼承時遵循里氏替換原則。第36頁/共26頁串講:面向?qū)ο蟮脑O(shè)計原則合成合成/ /聚合復(fù)用聚合復(fù)用原則原則定義定義:在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達(dá)到復(fù)用這些對象的目的。問

36、題問題由來由來:為了代碼復(fù)用而濫用繼承會增加系統(tǒng)構(gòu)建、維護時的難度及系統(tǒng)的復(fù)雜度。解決解決方案方案:如果兩個類是“Has-a”關(guān)系應(yīng)使用合成、聚合,如果是“Is-a”關(guān)系可使用繼承?!癐s-A”是嚴(yán)格的分類學(xué)意義上定義,意思是一個類是另一個類的“一種”。而“Has-A”則不同,它表示某一個角色具有某一項功能或組成部分。聚合(Aggregation)表示整體和部分的關(guān)系,表示“擁有”。如奧迪A6汽車,對奧迪A6引擎、奧迪A6輪胎的關(guān)系是聚合關(guān)系,離開了奧迪A6汽車,引擎、輪胎也可以單獨存在。合成(Composition)則是一種更強的“擁有”,部分和整體的生命周期一樣。合成的新的對象完全支配其組

37、成部分,包括它們的創(chuàng)建和湮滅等。比如人和人的大腦。第37頁/共26頁串講:面向?qū)ο蟮脑O(shè)計原則迪米特法則(亦迪米特法則(亦稱稱最少知識最少知識原則,原則,Least Knowledge Least Knowledge PrinciplePrinciple,LKPLKP)定義定義:一個對象應(yīng)該對其他對象保持最少的了解。也就是說,陌生的類最好不要作為局部變量的形式出現(xiàn)在類的內(nèi)部。問題由來問題由來:類與類之間的關(guān)系越密切,耦合度越大,當(dāng)一個類發(fā)生改變時,對另一個類的影響也越大。解決方案解決方案:盡量降低類與類之間的耦合。可以通俗的理解為不不跟跟“陌生人陌生人”說話,說話,只只與直接的朋友通信與直接的朋

38、友通信。每個對象都會與其他對象有耦合關(guān)系,只要兩個對象之間有耦合關(guān)系(依賴、關(guān)聯(lián)、組合、聚合等),我們就說這兩個對象之間是朋友關(guān)系。其中,我們稱出現(xiàn)成員變量、方法參數(shù)、方法返回值中的類為直接的朋友,而出現(xiàn)在局部變量中的類則不是直接的朋友。迪米特法則在運用到系統(tǒng)設(shè)計中應(yīng)注意以下幾點:每個類都應(yīng)當(dāng)盡量良好封裝。一個類對其它類的引用應(yīng)該降到最低,盡量避免在局部變量中引入陌生類。第38頁/共26頁串講:面向?qū)ο蟮脑O(shè)計原則接口隔離接口隔離原則原則定義定義:客戶端不應(yīng)該依賴它不需要的接口;一個類對另一個類的依賴應(yīng)該建立在最小的接口上。問題由來問題由來:類A通過接口I依賴類B,類C通過接口I依賴類D,如果接

39、口I對于類A和類B來說不是最小接口,則類B和類D必須去實現(xiàn)他們不需要的方法。解決方案解決方案:將臃腫的接口I拆分為獨立的幾個接口,類A和類C分別與他們需要的接口建立依賴關(guān)系。采用接口隔離原則對接口進(jìn)行約束時,要注意以下幾點:接口盡量小,但是要有限度。對接口進(jìn)行細(xì)化可以提高程序設(shè)計靈活性是不爭的事實,但是如果過小,則會造成接口數(shù)量過多,使設(shè)計復(fù)雜化。為依賴接口的類定制服務(wù),只暴露給調(diào)用的類它需要的方法,它不需要的方法則隱藏起來。只有專注地為一個模塊提供定制服務(wù),才能建立最小的依賴關(guān)系。提高內(nèi)聚,減少對外交互。使接口用最少的方法去完成最多的事情。第39頁/共26頁串講:面向?qū)ο蟮脑O(shè)計原則單一單一職責(zé)職責(zé)原則原則定義定義:不要存在多于一個導(dǎo)致類變更的原因。通俗的說,即一個類只負(fù)責(zé)一項職責(zé)。問題由來問題由來:類T負(fù)責(zé)兩個不同的職責(zé):職責(zé)P1,職責(zé)P2。當(dāng)由于職責(zé)P1需求發(fā)生改變而需要修改類T時,有可能會導(dǎo)致原本運行正常的職責(zé)P2功能發(fā)生故障。解決方案解決方案:分別建立兩個類T1、T2,使T1完成職責(zé)P1功能,T2完成職責(zé)P2功能。這樣,當(dāng)修改類T1時,不會使職責(zé)P2發(fā)生故障風(fēng)險;同理,當(dāng)修改T2時,也不會使職責(zé)P1發(fā)生故障風(fēng)險。遵循單一職責(zé)原則

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論