一、面向?qū)ο蟮脑O(shè)計(jì)原則
1. 單一職責(zé)原則
? ? ? ? 一個(gè)類(lèi)只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)指責(zé)钞馁,就一個(gè)類(lèi)而言虑省,應(yīng)該只有一個(gè)引起它變化的原因。在軟件系統(tǒng)中僧凰,一個(gè)類(lèi)承擔(dān)的職責(zé)越多探颈,被復(fù)用的可能性就越小,而且一個(gè)類(lèi)承擔(dān)的職責(zé)越多训措,就相當(dāng)于這些職責(zé)藕合在一起伪节,當(dāng)一個(gè)職責(zé)變化時(shí),就會(huì)影響到其他職責(zé)的運(yùn)作绩鸣。
? ? ? ? 單一職責(zé)原則是實(shí)現(xiàn)高內(nèi)聚怀大、低耦合的方針,需要發(fā)現(xiàn)類(lèi)的不同職責(zé)并將其分離呀闻。
1.1 案例分析
? ? ? ? 如圖1-1 中化借,Market超市類(lèi)承擔(dān)過(guò)多的職責(zé),既包括業(yè)務(wù)類(lèi)的促銷(xiāo)活動(dòng)promotion()和售賣(mài)sale()方法捡多,又包含了文件操作類(lèi)的報(bào)表導(dǎo)出exportFile()方法蓖康。如果有其他類(lèi)需要使用報(bào)表導(dǎo)出功能,將無(wú)法重用垒手。違背了單一職責(zé)原則蒜焊。
? ? ? ? 用單一職責(zé)原則對(duì)Market類(lèi)做出改造:
? ? ? ? (1)FileUtil:負(fù)責(zé)操作文件;
? ? ? ? (2)CustomerService:負(fù)責(zé)同一類(lèi)業(yè)務(wù)的集中處理淫奔;
? ? ? ? (3)Market:負(fù)責(zé)自身的銷(xiāo)售與促銷(xiāo)山涡。
2. 開(kāi)閉原則
? ? ? ? 一個(gè)軟件實(shí)體應(yīng)當(dāng)隊(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉唆迁,即軟件實(shí)體應(yīng)該盡量不在修改原有代碼的情況下進(jìn)行擴(kuò)展鸭丛。為了滿(mǎn)足開(kāi)閉原則,需要隊(duì)系統(tǒng)進(jìn)行抽象化設(shè)計(jì)唐责,抽象化是開(kāi)閉原則的關(guān)鍵鳞溉。常見(jiàn)的做法是為系統(tǒng)定義一個(gè)穩(wěn)定的抽象接口、抽象類(lèi)鼠哥,再通過(guò)具體類(lèi)來(lái)進(jìn)行擴(kuò)展熟菲,無(wú)須對(duì)抽象層進(jìn)行修改看政,只需要增加新的實(shí)現(xiàn)類(lèi)即可完成擴(kuò)展,達(dá)到開(kāi)閉原則的要求抄罕。
2.1 案例分析
? ? ? ? 如圖2-1允蚣,一個(gè)人Person對(duì)于四季穿衣的不同,依賴(lài)于季節(jié)的種類(lèi)呆贿,Person類(lèi)dress()方法部分代碼如下:
... ...
if ( season.equals("spring")){
? ? ? ? Spring spring = new Spring();
? ? ? ? spring.dress();
} else if ( season.equals("summer)){
? ? ? ? Summer summer = new Summer();
? ? ? ? summer.dress();
} else if ( season.equals("Autumn")){
? ? ? ? Autumn autumn = new Autumn();
? ? ? ? autumn.dress();
} else {
? ? ? ? Winter winter = new Winter();
? ? ? ? winter.dress();
}
... ...
? ? ? ? 如果需要增加一個(gè)季節(jié)嚷兔,或者增加其他場(chǎng)合的穿衣場(chǎng)景,則需要修改Person類(lèi)的dress()方法做入,違背了開(kāi)閉原則冒晰。
? ? ? ? 針對(duì)開(kāi)閉原則進(jìn)行改造,如下:
? ? ? ? (1)引入抽象類(lèi)AbstractOccasion竟块,將具體的場(chǎng)景作為AbstractOccasion的子類(lèi)壶运;
? ? ? ? (2)PersonDress針對(duì)不同場(chǎng)景的穿衣進(jìn)行操作(在PersonDress中調(diào)用occasion對(duì)象的dress()方法),具體場(chǎng)景由客戶(hù)端選擇浪秘。