面向對象五大原則_1.單一職責原則&2.裏氏替換原則
單一職責原則:Single Responsibility Principle (SRP)
一個類。僅僅有一個引起它變化的原因。應該僅僅有一個職責。每個職責都是變化的一個軸線。假設一個類有一個以上的職責,這些職責就耦合在了一起。這會導致脆弱的設計。當一個職責發生變化時,可能會影響其他的職責。另外,多個職責耦合在一起,會影響復用性。
比如:要實現邏輯和界面的分離。
T負責兩個不同的職責:職責P1。職責P2。當因為職責P1需求發生改變而須要改動類T時。有可能會導致原本執行正常的職責P2功能發生問題。
也就是說職責P1和P2被耦合在了一起。
原因是職責擴散:由於某種原因,某一職責被分化為顆粒度比如Iphone接口,打電話分為四個過程,撥號。通話,回撥。掛機。
這種優點: 協議管理和數據傳送分開,假設將來科技進步。那麽就降低了由於變更而引起的工作量。可維護性和可讀性提高了。
再來一個樣例: 改動信息
改動後:
繼承的優缺點 長處:代碼共享。重用性,可擴展性 缺點:減少了代碼的靈活性,添加了耦合性(父變子則變)
悟 : 父類就是為了解決子類們基礎問題而存在,好比父類就是大地,而子類就是大地上全部植物,父類就攻克了土地,水的問題。
1.子類繼承父類的成員變量
當子類繼承了某個類之後,便能夠使用父類中的成員變量。可是並非全然繼承父類的全部成員變量。詳細的原則例如以下:
1)可以繼承父類的public和protected成員變量;不可以繼承父類的private成員變量;
2)對於父類的包訪問權限成員變量,假設子類和父類在同一個包下。則子類可以繼承;否則。子類不可以繼承。
3)對於子類能夠繼承的父類成員變量,假設在子類中出現了同名稱的成員變量,則會發生隱藏現象,即子類的成員變量會屏蔽掉父類的同名成員變量。假設要在子類中訪問父類中同名成員變量,須要使用superkeyword來進行引用。
2.子類繼承父類的方法
相同地,子類也並非全然繼承父類的全部方法。
1)可以繼承父類的public和protected成員方法。不可以繼承父類的private成員方法;
2)對於父類的包訪問權限成員方法,假設子類和父類在同一個包下,則子類可以繼承。否則,子類不可以繼承。
3)對於子類能夠繼承的父類成員方法。假設在子類中出現了同名稱的成員方法,則稱為覆蓋。即子類的成員方法會覆蓋掉父類的同名成員方法。
假設要在子類中訪問父類中同名成員方法,須要使用superkeyword來進行引用。
註意:隱藏和覆蓋是不同的。隱藏是針對成員變量和靜態方法的,而覆蓋是針對普通方法的。(後面會講到)
3.構造器
子類是不可以繼承父類的構造器,可是要註意的是。假設父類的構造器都是帶有參數的,則必須在子類的構造器中顯示地通過superkeyword調用父類的構造器並配以適當的參數列表。假設父類有無參構造器,則在子類的構造器中用superkeyword調用父類構造器不是必須的,假設沒有使用superkeyword,系統會自己主動調用父類的無參構造器。
原則1:子類必須全然實現父類的方法 就如上面所說的,假如大地的子類玉兔,這個東西既不須要土地和水,卻繼承了大地,那麽這是不合理的。
子類必須全然實現父類的方法就是為了代碼復用。
原則2:子類能夠有自己的個性 在子類出現的地方。父類未必能夠勝任。 子類在繼承的同一時候能夠擴展出其它方法和屬性。萬物生長,基於大地。 原則3:覆蓋式實現父類的方法時輸入參數可被放大 首先理解重寫和重載的差別: 重載:方法名同樣,參數不同。重寫:方法名同樣。參數同樣。
分析:覆蓋式實現父類方法事實上就是重載,假設子類中輸入參數被放大,那麽父類那部分代碼就沒有浪費,這句話說的非常晦澀。的確剛剛學的時候想了好久。後來再看了一下原則就釋然了,代碼重用!
每一個方法必須有所用處,父類中的參數範圍盡管沒有子類的大。子類的重載是為了擴展。彌補了父類的不足。一般來說,是不會去重載的。
假設反過來。假設子類的參數範圍比父類要小,相當於子類方法中有倆個方法,一個是父類的方法,一個是子類的,父類參數範圍大,子類範圍小。有父類的地方子類卻不能使用,這個已經違背了原則。悟 : 重載就是將父類的類名稱改為子類名,再加一個方法名同樣。參數不同的方法。 重寫就是將父類的類名稱改為自類名,再改動一下被重寫的方法。
樣例: Father 類
public class Father { public Collection doSomething(Map map){ System.out.println("父類:Map 轉集合"); return map.values(); } }
Son 類
public class Son extends Father { public Collection doSomething(HashMap map) { System.out.println("子類:Hashmap 轉集合"); return map.values(); } }
測試類
public static void main(String[] args) { Son f=new Son(); //倆個方法 一個 HashMap h=new HashMap(); f.doSomething(h); //子類 }
結果:
子類:Hashmap
轉集合
參考書籍:
《設計模式之禪》
參考文章:
http://www.cnblogs.com/dolphin0520/p/3803432.html http://www.cnblogs.com/xiaoao808/archive/2008/03/11/1100886.html
我是菜鳥,我在路上。
面向對象五大原則_1.單一職責原則&2.裏氏替換原則