面向對象的三大基本特徵和五大基本原則

前言

前文提到,面向對象的三個特徵:封裝、繼承、多態。那麼面向對象是怎麼體現這三個特徵呢?編程

關於五大基本原則,我的找資料的時候看得頭都大了,對新手(如我)來講仍是比較有理解難度的,本篇用較爲簡單的表述來幫助理解,想先看進階版(徹底版)的能夠先移步:牢記面向對象五個基本原則安全

面向對象的三大基本特徵

1. 封裝

封裝,就是將客觀事物抽象爲邏輯實體,實體的屬性和功能相結合,造成一個有機的總體。並對實體的屬性和功能實現進行訪問控制,向信任的實體開放,對不信任的實體隱藏。,經過開放的外部接口便可訪問,無需知道功能如何實現。框架

也就是說,封裝主要有如下目的:編碼

  • 可隱藏實體實現的細節。
  • 提升安全性,設定訪問控制,只容許具備特定權限的使用者調用。
  • 簡化編程,調用方無需知道功能是怎麼實現的,便可調用。

舉個栗子,X怎麼跟別人介紹他的女友?.net

個人女友{  
    屬性:  
        姓名;  
        (體重等信息就不必跟別人說了,隱藏起來)  
    行爲:  
        吃飯;  
        (其餘的別人也不須要知道,隱藏起來)  
}

X只須要跟別人說他女友一些公開的屬性就好了,其餘的能夠選擇隱藏。code

若是別人想約X跟X女友出來一塊兒吃個飯,只須要向X發出邀請,而無需知道X是怎麼跟X女友商量的。對象

2. 繼承

繼承,在繼承機制下造成有層級的類,使得低層級的類能夠延用高層級類的特徵和方法。繼承的實現方式有兩種:實現繼承、接口繼承。blog

實現繼承:直接使用基類公開的屬性和方法,無需額外編碼。繼承

接口繼承:僅使用接口公開的屬性和方法名稱,須要子類實現。接口

也就是說,繼承有如下目的:

  • 複用代碼,減小類的冗餘代碼,減小開發工做量。
  • 使得類與類之間產生關係,爲多態的實現打下基礎。

舉個栗子,怎麼樣作到年收千萬上億?繼承家產就很棒。

X爸{  
    屬性:  
        股票;  
        (現金和銀行存款做爲養老資產,隱藏起來)  
    行爲:  
        管理公司;  
}

X爸不想努力了,把公司交給X,本身的現金和銀行存款已經夠養老了。

X 繼承 X爸{  
    屬性:  
        股票;  
        (本身的現金和銀行存款,隱藏起來)  
    行爲:  
        管理公司;  
}

3. 多態

多態,是指一個類的同名方法,在不一樣狀況下的實現細節不一樣。多態機制實現不一樣的內部實現結構共用同一個外部接口

也就是說,多態有如下目的:

  • 一個外部接口可被多個同類使用。
  • 不一樣對象調用同個方法,可有不一樣實現。

舉個栗子,擁有千萬資產的X想跟女友結婚了。

娶親{  
    行爲:  
        領證{挑個黃道吉日去領證};  
        擺酒{宴請各路親戚三頓飯};  
}

X不想像父輩那樣專門挑個日子去領證,也不想請一堆不認識的親戚吃飯。跟未婚妻商量以後,決定這麼作。

X娶親 繼承 娶親{  
    行爲:  
        領證{跟未婚妻飯後散步,順便領證};  
        擺酒{僅僅是宴請親人和兩人各自最好的幾個朋友};  
}

當別人在討論X是怎麼娶親的時候,能夠經過娶親這個父類,來指向X娶親子類,這樣就能夠知道X是怎麼娶親了。

從上述能夠看出,多態實現的三個必要條件是:繼承、重寫(子類繼承父類後,對繼承的方法從新定義)、父類應用指向子類對象。因此,多態的實現是基於繼承的。

面向對象的五大基本原則

1. 單一職責原則(SRP)

其核心思想爲:一個類,最好只作一件事,只有一個引發它的變化。

一個類,最好有且僅有一個引發它變化的緣由。

舉個栗子,職員類裏包括了普通員工、經理、老闆,那類中勢必須要用if else來區分判斷,並且不管是這三種職員的需求發生變化,都會影響到整個職員類。

按照「單一職責原則」,將普通員工、經理、老闆分別建一個類,既不用if else加以區分,也不會在修改某個職員類別的時候影響另外一個。

2. 開放封閉原則(OCP)

其核心思想是:軟件實體應該是可擴展的,而不可修改的。

一個類,能夠擴展(添加屬性和功能),可是不要修改已經寫好的屬性和方法。

實現開開放封閉原則的核心思想就是對抽象編程,而不對具體編程,由於抽象相對穩定。

打個簡單的比方,X的大舅二舅都是他舅,是有血緣關係的舅舅,若是忽然冒出來一個跟他有血緣關係的三舅,那也是他舅舅。同時也不能改變他大舅和二舅的親緣關係。

3.里氏替換原則(LSP)

其核心思想是:子類必須可以替換其基類。

類A是類B的父類,那麼在進行調用的時候,類A能夠引用類B,可是反過來不行。

其實能夠粗糙地理解爲,類A就是對外提供一個接口,具體的實如今類B中。

實現的方法是面向接口編程:將公共部分抽象爲基類接口或抽象類,經過Extract Abstract Class,在子類中經過覆寫父類的方法實現新的方式支持一樣的職責。

也就是說,其實里氏替換原則是繼承和多態的綜合體現。

4. 依賴倒置原則(DIP)

其核心思想是:依賴於抽象。具體而言就是高層模塊不依賴於底層模塊,兩者都同依賴於抽象;抽象不依賴於具體,具體依賴於抽象。

在對客觀事物抽象成邏輯實體時,能夠先思考,同類事物的共性是什麼,將這個共性做爲這類事物的「高層模塊」,若干不一樣的客觀事物做爲「底層模塊」在依賴」高層「以後,對共性進行特定描述。

舉個栗子,蘋果跟西瓜都是水果,水果的共同屬性是水分、糖分。在這裏,」水果「做爲高層模塊,其屬性能夠在描述「蘋果」和「西瓜」的時候使用,因此「蘋果」「西瓜」在此是「底層模塊」。

5. 接口隔離原則

其核心思想是:使用多個小的專門的接口,而不要使用一個大的總接口。

接口中定義屬性和須要子類實現的方法,實現類必須徹底實現接口的全部方法、屬性。爲何要接口隔離呢?目的有二:

  • 避免引用接口的類,須要實現其實用不到的接口方法、屬性。
  • 避免當接口修改的時候,有一連串的實現類須要更改。
分離的手段主要有如下兩種:一、委託分離,經過增長一個新的類型來委託客戶的請求,隔離客戶和接口的直接依賴,可是會增長系統的開銷。二、多重繼承分離,經過接口多繼承來實現客戶的需求,這種方式是較好的。
  • 委託分離,不直接使用原先的接口,能夠用另外增長一個新的接口或類來實現需求。
  • 多重繼承分離,JDK源碼、Spring框架使用了這種方式,後續的JDK源碼解析系列會說起,好奇的朋友能夠查看集合類的結構。

結語

用文字表述出來比單純理解難多了,但在寫博客的同時,也推動本身思考。五大基本原則做爲原則,在實際應用中一定會有妥協,爲他人所用,予他人便利,纔是它們存在的意義。

附加(03-05):

網上有不少說法是,面向對象有四個特徵:封裝、繼承、多態、抽象。爲何小編沒有在這裏寫出來?

由於不管面向對象仍是面向過程,將具體事物抽象成類,或者將問題解決過程抽象出來,這一步是少不了的。抽象已經融入到面向對象和麪向過程的DNA裏面了,因此我的認爲,這一點是不必分出來的,因此也就沒寫出來了。

相關文章
相關標籤/搜索