程序中全部的依賴關係都終止於抽象類或者接口, 纔是真正的面向對象設計java
設計原則一 : 單一職責原則編程
定義: 對於一個類,應該只有一個引發它變化的緣由.ide
優勢: 下降類的複雜度,提升類的可讀性,提升系統的可維護性.函數
例子: spa
//超人類 public class SuperMan { public void 維護世界和平(){ //超人維護世界和平 } } 擴展: public class Animal { public void breathe(String animal){ System.out.println(animal + "在空氣中呼吸"); } public void breathe2(String animal){ System.out.println(animal + "在水中呼吸"); } }
能夠違反單一職責原則的條件: 須要足夠簡單的邏輯,才能夠在 代碼級別上 違反單一職責原則.設計
須要類中的方法數量足夠少,才能夠在 方法級別上 違反單一職責原則.code
設計原則二 : 里氏代換原則 (Liskov Substitution Principle, LSP)
對象
定義: 子類型必須可以替換掉它們的父類型.
繼承
該原則反映了父類和子類的關係,是面向對象設計中最重要也是最基本的原則之一.接口
優勢:使的代碼複用變得簡單
//老木匠類 public class OldCarpenter { public void makeFurniture(){ System.out.println("作出一把椅子!"); } } //老木匠徒弟類 public class YoungFurniture() extends OldCarpenter{ //覆蓋父類方法 @Override public void makeFurniture(){ super.makeFurniture(); System.out.println("裝飾了一下椅子!"); } }
設計原則三 : 開放-封閉原則(Open Closed Principle, OCP)
定義: 程序的實體對象(模塊,類,函數等)應該能夠進行擴展,但不該該能夠修改
特徵: 對於擴展是開放的, 對於修改是封閉的
意義: 開放-封閉原則的核心思想就是面向抽象編程
//動物類 public class Animal { //動物會呼吸 public void breath(){ System.out.println("呼吸"); } } //貓類從動物類繼承 public class Cat extends Animal { public void catchMouse(){ System.out.println("貓抓老鼠"); } } //咪咪類 public class Mimi extends Cat{ public void Swimming(){ System.out.println("咪咪在游泳"); } }
設計原則四 : 依賴倒轉原則
定義: 程序的高層模塊不該該依賴於低層模塊,但二者都應依賴於抽象 ; 抽象不該該依賴於具體細節,而細節應該依賴於抽象.
面向對象應該針對接口編程,而不是針對現實編程.
使用該原則的規範: 1. 每一個類儘可能都繼承自接口或抽象類 , 或者 抽象類和接口二者都具有.
2. 變量的顯示類型儘可能是接口或者是抽象類
3. 儘可能避免從具體類派生
4. 儘可能不要覆蓋基類的方法 , 由於類間依賴的是抽象,覆蓋了抽象的方法,對依賴的穩定性會產生必定
的影響
//工做者接口 interface IWorker { public void work(); } public class Worker implements IWorker{ @Override public void work() { // TODO Auto-generated method stub } } //新增工做者 public class SeniorWorker implements IWorker{ @Override public void work() { // TODO Auto-generated method stub } } //管理類 public class Manager { IWorker m_worker; public void setWorker (IWorker w){ m_worker = w; } public void manager(){ m_worker.work(); } }
設計原則五 : 合成/聚合複用原則
定義: 儘可能不使用類繼承, 而儘可能使用合成/聚合
聚合是一種比較"弱"的擁有關係,具體表現是 ; 甲對象中能夠包括乙對象,但乙對象不是甲對象的一部分
合成是一種比較"強"的擁有關係,具體表現是 : 嚴格的總體與部分之間的關係,且總體與部分有相同的生命週期
怎樣選擇使用繼承仍是 合成/聚合方法?
1. 子類是父類的一個特殊種類,而不是父類的一個角色時,使用繼承.即區分是"Is-A"和"Has-A". "Is-A"用繼承,"Has-A"用合
成/聚合
2. 永遠不會出現須要將子類換成另一個類的子類時,使用繼承.
3. 子類具備繼承父類的責任,而不是重寫父類的方法時,使用繼承
設計原則六 : 迪米特法則(最少知識原則)
定義: 若是兩個類之間沒必要直接通訊,則這兩個類不該該發生直接的相互做用. 若是其中一個類須要調用另外一個類的某個方法,能夠經過第三方來轉發這個調用.