1、字段上移
修改點(diǎn):兩個(gè)子類擁有相同的字段
做法:將該字段移至父類
2、函數(shù)上移
修改點(diǎn):有些函數(shù),在各個(gè)子類中產(chǎn)生完全相同的效果
做法:將該函數(shù)移至父類
有一種特殊情況也需要這么做:子類函數(shù)覆蓋了父類的,但是仍然做著相同的工作
在此重構(gòu)中你可能會(huì)遇到一種情況,就是你提煉的函數(shù)調(diào)用了子類有而父類沒(méi)有的函數(shù),那么在父類中給此父類沒(méi)有的函數(shù),建立一個(gè)虛函數(shù)即可。
3、構(gòu)造函數(shù)本體上移
修改點(diǎn):你在各個(gè)子類中擁有一些構(gòu)造函數(shù),它們的本體幾乎完全一致
做法:在父類中新建一個(gè)構(gòu)造函數(shù),并在子類構(gòu)造函數(shù)中調(diào)用它。
4、函數(shù)下移
修改點(diǎn):父類中的某個(gè)函數(shù)只與部分(而非全部)子類有關(guān)
做法:將這個(gè)函數(shù)移到相關(guān)的那些子類去。
5、字段下移
修改點(diǎn):父類中某個(gè)字段只被部分(而非全部)子類用到
做法:講這個(gè)字段下移到相關(guān)的子類去。
6、提煉子類
修改點(diǎn):類中的某些特性只被某些(而非全部)實(shí)例用到
做法:新建一個(gè)類,將上面所說(shuō)的那一部分特性移至子類
7、提煉父類
修改點(diǎn):兩個(gè)類有相似特性
做法:為這兩個(gè)類建立一個(gè)父類,將相同特性移至超類
8、提煉接口
修改點(diǎn):若干客戶使用類接口中的同一子集,或者兩個(gè)類的接口有部分相同
做法:將相同子集提煉到一個(gè)獨(dú)立接口
意思很簡(jiǎn)單,就是將一個(gè)類里的一些業(yè)務(wù)相關(guān)的函數(shù),或者是兩個(gè)類中部分相同的函數(shù),提取為Interface(這里不用接口用個(gè)英文的原因是在前面的文章中接口一詞可能更多的可以理解為一個(gè)類的公共函數(shù))
9、折疊繼承體系
修改點(diǎn):父類和子類無(wú)太大區(qū)別
做法:將它們合為一體
10、塑造模版函數(shù)
修改點(diǎn):你有一些子類,其中相應(yīng)的某些函數(shù)以相同順序執(zhí)行類似的操作,但各個(gè)操作的細(xì)節(jié)上有所不同
做法:將這些操作分別放進(jìn)獨(dú)立函數(shù)中,并保持它們具有相同的簽名,于是原函數(shù)也就變得相同了,然后將原函數(shù)上移至父類
意思很簡(jiǎn)單,就是說(shuō)你看見(jiàn)有些函數(shù)的具體操作不同,但是幾個(gè)函數(shù)的組合操作順序是一樣的,那么就把它們的操作順序提煉成函數(shù)放進(jìn)父類。
11、以委托取代繼承
修改點(diǎn):某個(gè)子類只使用父類接口的一部分,或是根本不需要繼承來(lái)的數(shù)據(jù)
做法:在子類中新建一個(gè)字段用以保存父類;調(diào)整子類函數(shù),令它改而委托超類;然后去掉兩者之間的繼承關(guān)系
動(dòng)機(jī):隨著需求的變化,一開(kāi)始的繼承關(guān)系可能在慢慢變化后,你就發(fā)現(xiàn)父類中的許多操作并不適用于子類
Troy:這個(gè)時(shí)候你當(dāng)然可以去把這些不適用子類的方法去搞到另一個(gè)子類里,但是如果做不到,那么就將父類對(duì)象作為子類的一個(gè)對(duì)象吧,去掉繼承關(guān)系,這在設(shè)計(jì)模式里面貌似可以叫橋接模式
12、以繼承取代委托(看吧看吧,總是有相反的兩個(gè)重構(gòu)操作出現(xiàn))
修改點(diǎn):你在兩個(gè)類之間使用委托關(guān)系,并經(jīng)常為整個(gè)接口編寫(xiě)許多極簡(jiǎn)單的委托函數(shù)
做法:讓委托類繼承受托類
兩條告誡:
1.如果你并沒(méi)有使用受托類的所有函數(shù)。那么你可能不需要使用此方法,你可以去去除中間人,用客戶端直接調(diào)用受托類,也可以把委托類和受托類之間提煉出一個(gè)超類,當(dāng)然也可以提取接口
2.受托對(duì)象被不止一個(gè)其他對(duì)象共享,而且受托對(duì)象是可變的。那么這種情況下你也不應(yīng)該用此重構(gòu),因?yàn)檫@樣就無(wú)法共享數(shù)據(jù)了,數(shù)據(jù)共享是委托關(guān)系承擔(dān)的一種責(zé)任,你無(wú)法把它轉(zhuǎn)化為繼承關(guān)系。如果受托對(duì)象不可變你才能這么做。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注