面向對象編程的三特性、七原則和六視點

1、面向對象的特性html

三個基本的特性:封裝、繼承與多態。編程

一、封裝
面向對象編程核心思想這一就是就是將數據和對數據的操做封裝在一塊兒.經過抽象,即從具體的實例中抽取共同的性質造成通常的概念,好比類的概念.網絡

二、繼承
繼承體現了一種先進的編程模式.子類能夠繼承父類的屬性和功能,即子類繼承了父類所具備的數據和數據上的操做,同時又能夠增添子類獨有的數據和數據上的操做.例如,"人類"繼承了"哺乳類"的屬性和功能,同時又增添了人類獨有的屬性和功能.
三、多態
 
多態是面向對象編程的又一重要特徵.有兩種意義的多態(表現爲方法的重寫(Overriding)和重載(Overloading)) 

 一種是操做名稱的多態,即有多個操做具備相同的名字,但這些操做所接收的消息類型必須不一樣.所謂操做名稱的多態是指能夠向操做傳遞不一樣消息,以便讓對象根據相應的消息來產生必定的行爲.

2、七大基本原則 
7大基本原則:單一職責原則SRP(Single Responsibility Principle)、開放封閉原則OCP(Open-Close Principle) 、替換原則、依賴原則(the Dependency Inversion Principle DIP) (the Liskov Substitution Principle LSP) 、接口分離原則(the Interface Segregation Principle ISP)、「迪米特」法則 、組合/聚合原則 

一、單一職責原則SRP(Single Responsibility Principle)
一個類只負責一項職責
能夠下降類的複雜度,一個類只負責一項職責,其邏輯確定要比負責多項職責簡單的多;
提升類的可讀性,提升系統的可維護性;
變動引發的風險下降,變動是必然的,若是單一職責原則遵照的好,當修改一個功能時,能夠顯著下降對其餘功能的影響。
須要說明的一點是單一職責原則不僅是面向對象編程思想所特有的,只要是模塊化的程序設計,都適用單一職責原則。

二、開放封閉原則OCP(Open-Close Principle) 
對擴展開放,對修改封閉。
一個模塊在擴展性方面應該是開放的而在更改性方面應該是封閉的。好比:一個網絡模塊,原來只服務端功能,而如今要加入客戶端功能,
那麼應當在不用修改服務端功能代碼的前提下,就可以增長客戶端功能的實現代碼,這要求在設計之初,就應當將服務端和客戶端分開,公共部分抽象出來。

三、里氏替換原則(the Liskov Substitution Principle LSP) 
子類應當能夠替換父類並出如今父類可以出現的任何地方。
里氏替換原則是1987年麻省理工學院一位姓裏的女士提出的關於繼承方面的原則: 子類必須確保父類的行爲不被修改,即子類不能覆蓋父類的非抽象方法
只有這樣才能確保子類可以替換父類的任何對象。通俗一點說就是 老鼠的兒子會打洞。
里氏替換原則是關於繼承方面的原則,子類能夠實現父類的抽象方法,不能覆蓋非抽象方法;子類能夠擴展本身的方法。該原則確保父類的行爲不會改變,後續有對系統作者擴展時,可以保障系統的穩定性。

 

四、依賴倒轉原則(the Dependency Inversion Principle DIP) 

Robert Martin大師提出了面向對象設計原則----依賴倒置原則。依賴倒置原則(Dependence Inversion Principle,簡稱DIP)這個名字看着有點彆扭,「依賴」還「倒置」,這究竟是什麼意思?依賴倒置原則的原始定義是:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。翻譯過來,包含三層含義:模塊化

  • 高層模塊不該該依賴低層模塊,二者都應該依賴其抽象;
  • 抽象不該該依賴細節;
  • 細節應該依賴抽象。

     高層模塊和低層模塊容易理解,每個邏輯的實現都是由原子邏輯組成的,不可分割的原子邏輯就是低層模塊,原子邏輯的再組裝就是高層模塊。那什麼是抽象,什麼又是細節呢?抽象就是指接口或抽象類,二者都是不能直接被實例化的;細節就是實現類,實現接口或繼承抽象類而產生的類就是細節,其特色就是能夠直接被實例化,也就是能夠加上一個關鍵字new產生一個對象。依賴倒置原則表現就是:spa

  • 模塊間的依賴是經過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是經過接口或抽象類產生的;
  • 接口或抽象類不依賴於實現類;
  • 實現類依賴接口或抽象類。
具體依賴抽象,上層依賴下層。假設B是較A低的模塊,但B須要使用到A的功能,
這個時候,B不該當直接使用A中的具體類: 而應當由B定義一抽象接口,並由A來實現這個抽象接口,B只使用這個抽象接口:這樣就達到
了 依賴倒置的目的,B也解除了對A的依賴,反過來是A依賴於B定義的抽象接口。經過上層模塊難以免依賴下層模塊,假如B也直接依賴A的實現,那麼就可能造 成循環依賴。一個常見的問題就是編譯A模塊時須要直接包含到B模塊的cpp文件,而編譯B時一樣要直接包含到A的cpp文件。

五、接口分離原則(the Interface Segregation Principle ISP) 
模塊間要經過抽象接口隔離開,而不是經過具體的類強耦合起來。即面向接口編程

六、「迪米特」法則
若是兩個類沒必要彼此直接通訊,那麼這兩個類就不該當發生直接的相互做用。若是其中一個類須要調用另外一類的某一個方法的話,能夠經過第三者轉發這個調用。
又叫最少知識原則,就是說,一個對象應當對其餘對象有儘量少的瞭解
① 在類的劃分上,應該建立有弱耦合的類;
② 在類的結構設計上,每個類都應當儘可能下降成員的訪問權限;
③ 在類的設計上,只要有可能,一個類應當設計成不變類;
④ 在對其餘類的引用上,一個對象對其它對象的引用應當降到最低;
⑤ 儘可能下降類的訪問權限;
⑥ 謹慎使用序列化功能;
⑦ 不要暴露類成員,而應該提供相應的訪問器(屬性)。 

七、組合/聚合原則
 
  繼承是一種強耦合的結構,父類變,子類就必需要變。「合成/聚合複用原則」:儘可能使用合成/聚合,儘可能不要使用類繼承。它的好處是:優先使用對象的合成/聚合將有助於咱們保持每一個類被封裝,並被集中在單個任務上。這樣的類和類繼承層次會保持較小規模,而且不太可能增加成爲不可控制的龐然大物。
  又叫合成複用原則。原則就是在一個新的對象裏面經過關聯關係(包括組合關係和聚合關係)使用一些已有的對象,使之成爲新對象的一部分,新對象經過委派調用已有對象的方法達到複用其已有功能的目的。也就是,要儘可能使用類的合成複用,儘可能不要使用繼承。

就是在一個新的對象裏面使用一些已有的對象,使之成爲新對象的一部分,新的對象經過向這些對象的委派達到複用已有功能的目的。這個原則有一個簡短的描述:要儘可能使用合成、聚合,儘可能不要使用繼承。.net

1)  新對象存取成分對象的惟一方法是經過成分對象的接口翻譯

2)  這種複用是黑箱複用,由於成分對象的內部細節是新對象所看不到的設計

3)  這種複用能夠在運行時間內動態進行,新對象能夠動態的引用與成分對象類型相同的對象htm

4)  合成、聚合能夠應用到任何環境中去,而繼承只能應用到一些有限環境中去對象

5)  致使錯誤的使用合成、聚合與繼承的一個常見緣由是錯誤的把「Has-a」關係看成「Is-a」關係。若是兩個類是「Has-a」關係那麼應使用合成、聚合,若是是「Is-a」關係那麼可以使用繼承

在面向對象設計中,能夠經過兩種基本方法在不一樣的環境中複用已有的設計和實現,即經過組合/聚合關係或經過繼承。

1)   繼承複用:實現簡單,易於擴展。破壞系統的封裝性,從基類繼承而來的實現是靜態的,不可能在運行時發生改變,沒有足夠的靈活性;只能在有限的環境中使用。(「白箱」複用 )

2)   組合/聚合複用:耦合度相對較低,選擇性地調用成員對象的操做;能夠在運行時動態進行。(「黑箱」複用 )

組合/聚合可使系統更加靈活,類與類之間的耦合度下降,一個類的變化對其餘類形成的影響相對較少,所以通常首選使用組合/聚合來實現複用;

其次才考慮繼承,在使用繼承時,須要嚴格遵循里氏代換原則,有效使用繼承會有助於對問題的理解,下降複雜度,而濫用繼承反而會增長系統構建和維護的難度以及系統的複雜度,所以須要慎重使用繼承複用。
 
3、六大視點
 複用(Reusibility)
擴展(Extensibility)
分離(Separability)
變化(Change)
簡約(Simplicity)
一致(Coherance)迪米特法則:http://blog.csdn.net/yuluows/article/details/7082203依賴倒置原則:http://www.cnblogs.com/lzh_527/archive/2012/02/15/2352939.html
相關文章
相關標籤/搜索