1. 程式人生 > >面向對象五大原則_1.單一職責原則&2.裏氏替換原則

面向對象五大原則_1.單一職責原則&2.裏氏替換原則

解決 一次 cti prot 輸入 名稱 enter wid col


單一職責原則:Single Responsibility Principle (SRP)
一個類。僅僅有一個引起它變化的原因。應該僅僅有一個職責。每個職責都是變化的一個軸線。假設一個類有一個以上的職責,這些職責就耦合在了一起。這會導致脆弱的設計。當一個職責發生變化時,可能會影響其他的職責。另外,多個職責耦合在一起,會影響復用性

比如:要實現邏輯和界面的分離。


T負責兩個不同的職責:職責P1。職責P2。當因為職責P1需求發生改變而須要改動類T時。有可能會導致原本執行正常的職責P2功能發生問題。

也就是說職責P1和P2被耦合在了一起。

原因是職責擴散:由於某種原因,某一職責被分化為顆粒度
更細的多個職責了


比如Iphone接口,打電話分為四個過程,撥號。通話,回撥。掛機。

技術分享

這樣子貌似沒錯。可是細致想一想擴展性和變更,你會發現。假設將來升級,要轉化為數字電話,那麽通話要又一次寫,撥號也是。 這樣一來的話。須要一種更好的設計,無論一種方法怎樣變化,還有一種無論。這就是職責單一原則。 思路例如以下: Iphone這個接口有倆個職責,一個是協議管理,一個是傳輸數據。

一個負責數據傳輸,無論什麽數據,基於什麽版本號,而還有一個負責撥號和掛機,撥號僅僅負責能接通即可。 技術分享

這種優點: 協議管理和數據傳送分開,假設將來科技進步。那麽就降低了由於變更而引起的工作量。可維護性和可讀性提高了。


再來一個樣例: 改動信息 技術分享


改動後:

技術分享


裏氏替換原則: Liskov Substitution Principle,LSP
繼承的優缺點 長處:代碼共享。重用性,可擴展性 缺點:減少了代碼的靈活性,添加了耦合性(父變子則變)
: 父類就是為了解決子類們基礎問題而存在,好比父類就是大地,而子類就是大地上全部植物,父類就攻克了土地,水的問題。

 

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.裏氏替換原則