為什么需要設(shè)計(jì)模式?
我的理解設(shè)計(jì)模式就是一種針對(duì)某種問題的套路,是一套被反復(fù)使用,多數(shù)人所知曉的,經(jīng)過分類編目的,代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。
1.開閉原則
1.1 定義:
????一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,即軟件實(shí)體應(yīng)盡量在不修改原有代碼下進(jìn)行擴(kuò)展。
????軟件實(shí)體:指一個(gè)軟件模板,一個(gè)由多個(gè)類組成的局部結(jié)構(gòu)或一個(gè)獨(dú)立的類。
1.2 個(gè)人理解
????就是對(duì)于一個(gè)程序來說,舉個(gè)例子
if(type==1){
//語句
}eles if(type==2){
//語句
}else if(type==3){
//語句
}
對(duì)于這個(gè)代碼來說,type的值就限制在[1,2,3],如果我們后面還想要type==4,那我們就需要去在這段代碼去更改,但這樣就會(huì)違背開閉原則。這個(gè)原則是用來約束或者改進(jìn)代碼業(yè)務(wù),對(duì)于一個(gè)很復(fù)雜的項(xiàng)目來說,如果添加一個(gè)功能,需要去找很多其他的源碼去修改,不是很麻煩嗎
1.3 一般解決
????對(duì)于解決這種問題,一般使用抽象類去拓展業(yè)務(wù),讓抽象類作為中轉(zhuǎn)站去添加,這樣就只需要添加而不需要修改
2. 里氏代換原則
2.1 定義
????所有引用基(父)類的地方必須能夠透明的使用其子類。
2.2 個(gè)人理解
????前提:一個(gè)方法可以使用父類對(duì)象,結(jié)果:這個(gè)方法也可以使用其子類對(duì)象。反過來,則不行。
注意項(xiàng):
- 子類的所有的方法都必須在父類去聲明,或者子類全部實(shí)現(xiàn)父類中所聲明的方法,而一般為了保證程序的可拓展性,一般由父類去定義(抽象類)
- 一般在使用這個(gè)原則時(shí),盡量把父類設(shè)計(jì)為抽象類或者接口,讓子類去實(shí)現(xiàn)或者繼承父類,并去實(shí)現(xiàn)父類的方法,使用實(shí)例時(shí)就用子類,這樣就很方便去添加子類和拓張功能。
- 在java語言中,在編譯階段,java程序會(huì)檢查一個(gè)程序是否符合里氏代換原則,這是一個(gè)與實(shí)現(xiàn)無關(guān)地,純粹就是語法上的檢測(cè),但是這種很有限就是了
2.3 例子
????就如同普通和vip都有發(fā)送郵箱這個(gè)功能,就將其提取處理,然后讓子類拓展
3. 依賴倒轉(zhuǎn)原則
3.1 定義
????抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象,針對(duì)接口編程。
3.2 個(gè)人理解
????就是高層模塊(業(yè)務(wù)邏輯)不應(yīng)該依賴于底層模塊(具體實(shí)現(xiàn)),而是通過抽象類或者接口依賴,而具體實(shí)現(xiàn)類依賴于抽象類。,就是在代碼傳遞參數(shù)時(shí)或者關(guān)聯(lián)關(guān)系中,盡量引用高層次的抽象類,然后把具體類可以寫在配置中。
3.3 例子
????首先對(duì)于這樣一個(gè)功能模塊,我么如果去添加新的拓展就會(huì)很麻煩,如word
但是,如果我們把這么這些拓展功能抽象出來,然后在使用時(shí),使用抽象類,在配置文件中配置相應(yīng)的類就行了。
4. 接口隔離原則
4.1 定義
????使用多個(gè)專門的接口,而不使用單一的總接口,即客戶端不應(yīng)該依賴那些它不需要的接口
????當(dāng)一個(gè)接口過大時(shí),我們需要將它分割成一些更細(xì)小的接口,使用該接口的客戶端僅需要知道與相關(guān)的方法
4.2 個(gè)人理解
????大概念:接口理解成一個(gè)類型提供的所有方法特征的集合→理解成角色→一個(gè)接口代表一個(gè)角色→隔離
????小概念:特定語言的接口,Isp思想就是將接口盡量獨(dú)立出來,為用戶提供盡量小的單一接口,而大接口中僅放不同小接口。
4.3 例子
????如同這個(gè)一般,各種功能都擠在一路去了,對(duì)于某些功能不需要的在里面
????就需要我們?nèi)ジ鶕?jù)功能去分開接口,這樣就不會(huì)擠在一起了。
5. 合成復(fù)用原則
5.1 定義
????盡量使用對(duì)象組合,而不是繼承來達(dá)到復(fù)用的目的。
5.2 個(gè)人理解
????盡量考慮組合而非繼承,除非嚴(yán)格遵循里氏代換原則,但是繼承則會(huì)暴露父類(基類)細(xì)節(jié)給子類導(dǎo)致封裝性被破壞、同時(shí)繼承而來的靈活度不夠,是靜態(tài),不是動(dòng)態(tài)。同時(shí)在發(fā)生變化時(shí),組合對(duì)于其他類的影響較小。
方式:比較簡(jiǎn)單,從繼承變成式關(guān)聯(lián),用依賴注入或者setter注入注入子類對(duì)象就行
5.3 例子
????對(duì)于這樣一個(gè)例子,如果要拓展功能的話,添加一個(gè)新的數(shù)據(jù)庫種類的話,那么,DAO類代碼也會(huì)改變。它的方法繼承于父類。
不過如果改為關(guān)聯(lián)關(guān)系的話,DBUtil的功能就可以讓子類通過依賴注入去擴(kuò)展。
6. 迪米特法制
6.1 定義
????一個(gè)軟件實(shí)體應(yīng)當(dāng)盡量少地于其他實(shí)體類發(fā)生相互作用。
????如果一個(gè)系統(tǒng)符合迪米特法則,那么當(dāng)其中某一個(gè)模塊發(fā)生修改時(shí),就會(huì)盡量少地影響其他模塊,擴(kuò)
展會(huì)相對(duì)容易,這是對(duì)軟件實(shí)體之間通信的限制,迪米特法則要求限制軟件實(shí)體之間通信的寬度和深
度。迪米特法則可降低系統(tǒng)的耦合度,使類與類之間保持松散的耦合關(guān)系
6.2 個(gè)人理解
對(duì)象的朋友定義:
- 當(dāng)前對(duì)象本身(this);
- 以參數(shù)形式傳入到當(dāng)前對(duì)象方法中的對(duì)象,
- 當(dāng)前對(duì)象的成員對(duì)象;
- 如果當(dāng)前對(duì)象的成員對(duì)象是一個(gè)集合,那么集合中的元素也都是朋友,
- 當(dāng)前對(duì)象所創(chuàng)建的對(duì)象。
????任何一個(gè)對(duì)象,如果滿足上面的條件之一,就是當(dāng)前對(duì)象的“朋友”,否則就是“陌生人”。在應(yīng)用迪米
特法則時(shí),一個(gè)對(duì)象只能與直接朋友發(fā)生交互,不要與“陌生人”發(fā)生直接交互,這樣做可以降低系統(tǒng)
的耦合度,一個(gè)對(duì)象的改變不會(huì)給太多其他對(duì)象帶來影響
????也就是盡量就是對(duì)象與對(duì)象之間的聯(lián)系。文章來源:http://www.zghlxwxcb.cn/news/detail-705161.html
6.3 例子
????對(duì)于這樣的一個(gè)ui組件聯(lián)系的話,它們之間聯(lián)系很復(fù)雜,改一個(gè)可能改全部
但我們用一個(gè)統(tǒng)一的聯(lián)系類去管理的話,就減少了它們之間的相互影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-705161.html
到了這里,關(guān)于設(shè)計(jì)模式的設(shè)計(jì)原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!