單一職責原則
一個類中應該是一組相關性很高的函數、數據的封裝;
開閉原則
- 定義:對於擴展是開放的,對於修改是封閉的;
- 理解:意思就是可以任意的往外邊擴展,但是不能對寫好的修改,怎麼達到這個要求呢?寫接口。執行的方法寫成接口,這樣如果我們要擴展不同的實現,那就可以擴展新的實現了原來接口的類,然後丟進去就可以啦;
實例:
//執行體 class A { // H:相當於任務的執行者 private void doA( H h){ h.doMyTask();//此處調用接口的方法,達到 閉 的效果,只管我要幹啥,具體怎麼幹可以不管 } } --------------------------- // 接口 interface H{ void doMyTask(); } --------------------------- //任務執行者實現體 class B implements H{ void doMyTask(){ sys.out("幹B的活"); } } class C implements H{ void doMyTask(){ sys.out("幹C的活"); } } //操作者 class K { A a =new A(); a.doA(new B); a.doA(new C); a.doA(new H(){ doMyTask(){ sys.out("幹隨時擴展自定義的活"); } }); }
+實例分析:
由上述我們可以分析得出,如果我是老K,我現在要讓A幹一件活,現在我知道要他幹什麼活,可以寫死在A的doA()方法裏邊,但是如果有一天這個活有了不同的要求,那麼我同樣還是找A來幹活,但是幹什麼活,通過接口的不同實現來定義;
里氏替換原則 LSP
- 定義:所有應用其基類的地方,必須都能透明的使用其子類的對象;
- 核心原理:抽象、繼承、多態
- 理解:當我要一個人幹一種活的時候,發現有一類人都要幹這種活,比如吃飯。那麼,我就可以把這一類人抽象出來,同樣幹“吃飯”這種活,不過很明顯,每個人都會有每個人的吃放。所以吃飯這個活也是抽象的,繼承的實現體具體去幹自己的活。當然,加入我是食堂的,我喊一聲可以吃放了。然後不同的人(實現體)就跑進食堂,紛紛吃自己的飯啦!
實例:
//食堂
class ShiTang{
void ganHuo(Person p){
p.chiFan();
}
}
//抽象
abstarct class Person{
public abstarct foid chiFan();
public void shuiJiao(){
//do ….
}
}
//小明
class xiaoMing extends Person{
public void chiFan(){
sys.out(“小明吃飯”);
}
}
//小兵
class xiaoBing extends Person{
public void chiFan(){
sys.out(“小兵吃飯”);
}
}分析:由Person類可以知道,我們把一類人抽象到父類,若果某一件活,不同子類有不同的幹法,就發方法抽象出來,子類繼承再具體實現它。真正要這一類人幹活的時候,直接調父類。這樣,如果傳入的是子類,也同樣適用,並且還能實現各幹各的活;
依賴倒置原則 DIP
- 定義:模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過接口或者抽象類產生的;
- 理解:假如我現在需要租個房子,然後我把身邊的朋友叫過來,說給我幫忙找個房子。然後朋友們就去找了。還有一種方案,我可以打個電話給中介,讓中介給我找。這樣的優勢就是,我和真正去找房子的人沒有直接的聯繫。如果朋友臨時有事,可能就不能幫忙給我找了。但是,中介就不會發生這種情況;所以,當我們要做一件事的時候,並不需要把做事的人拉進來,而只需要下訂單,把事情外包給專門做這種事情的人去做,具體是誰就不要管那麼多;這樣,可以隨時更換外包公司,而不影響自身業務;
實例:
//我 class Me{ Zu zu ; // 我找個中介 void setZu(Zu zu){ this.zu=zu; } void zuFangZi(){ zu.zuFang();//我找中介給我租房子 } } //租房這件事 interface Zu{ void zuFang(); } //中介 專幹租房的事 class ZhongJie implements Zu{ void zuFang(){ sys.out("中介租房"); } }
分析:有上述示例可以發現,我 和 中介 沒有了直接的關聯,但是照樣把事情幹了。如果這個中介倒閉了,我只要去換一家同樣嫩幫我租房子的中介set進來就可以啦!