開(kāi)閉原則
程序應(yīng)該對(duì)修改關(guān)閉,對(duì)拓展開(kāi)放便脊。
例如中文是姓在前名在后假褪,英文則反之。
下面的例子在不修改原有XiaoMing類(lèi)時(shí)拓展了其功能杂抽。
public interface Person{
String getName()
}
public class XiaoMing implements Person{
public String getName(){
return "小明";
}
}
public class MingXiao extends XiaoMing{
public String getEnglishName(){
return "明小";
}
}
依賴(lài)倒置原則
高層模塊不應(yīng)該依賴(lài)低層模塊诈唬,兩者都應(yīng)該依賴(lài)其抽象。
抽象不應(yīng)該依賴(lài)細(xì)節(jié)缩麸,細(xì)節(jié)應(yīng)該依賴(lài)抽象铸磅。
public class XiaoMing{
//這樣不好 如果日后要學(xué)其他課程就要修改XiaoMing類(lèi)
public void studyEnglish(){
//studyEnglish
}
}
修改后
public interface Course{
void study();
}
public class EnglishCourse implements Course{
public void study(){
//studyEnglish
}
}
public class MathCourse implements Course{
public void study(){
//studyMath
}
}
public class XiaoMing{
//這樣不好 如果日后要學(xué)其他課程就要修改XiaoMing類(lèi)
public void study(Course course){
//可以學(xué)習(xí)任意課程 而不用修改XiaoMing類(lèi)
course.study();
}
}
單一職責(zé)原則
不要存在多于一個(gè)導(dǎo)致類(lèi)修改的原因。
每個(gè)類(lèi)杭朱、方法阅仔、接口都應(yīng)該只有一個(gè)職責(zé)。避免多個(gè)職責(zé)相互影響弧械。
接口隔離原則
類(lèi)不應(yīng)該依賴(lài)它不需要的接口八酒。
應(yīng)該設(shè)計(jì)多個(gè)專(zhuān)用的接口,而不是單一的總接口刃唐。
迪米特原則(最少知道)
一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解羞迷。
不應(yīng)該引入其可以不使用的成員。如果有“人”幫我統(tǒng)計(jì)賬單唁桩,我只需要賬單統(tǒng)計(jì)項(xiàng)那么我不應(yīng)該引入賬單闭树,可由統(tǒng)計(jì)者匯報(bào)耸棒。
里氏替換原則
子類(lèi)可拓展父類(lèi)的功能但不能修改父類(lèi)功能荒澡。
在任何引用其父類(lèi)的地方都應(yīng)該能替換成子類(lèi)并保證邏輯不變。
- 子類(lèi)可以有自己特有方法
- 子類(lèi)不應(yīng)該覆蓋(重寫(xiě))父類(lèi)的非抽象方法与殃。
- 子類(lèi)重載父類(lèi)方法時(shí)入?yún)?yīng)該更加寬泛单山,出參應(yīng)該更加嚴(yán)格碍现。
里氏替換原則我理解的也不是很好,但覺(jué)得是有用的米奸,先遵循再在實(shí)踐中檢驗(yàn)昼接。
合成復(fù)用原則
組合、聚合有限繼承悴晰。
優(yōu)先使用組合慢睡、聚合能夠降低類(lèi)之間的耦合度,降低類(lèi)的使用難度铡溪。組合漂辐、聚合的關(guān)系是拿來(lái)就用不關(guān)心實(shí)現(xiàn)細(xì)節(jié),繼承則需要考慮父類(lèi)功能的影響棕硫。