Java OOP 思想

本篇是根據高煥堂老師的課程歸納記錄的,所講內容包括:Oriented、Class、extends(繼承&擴展)、implements、組合、(前三個均有的)Hook方法、IoC(主動調用、被動調用)

1. Oriented 面向

  • Oriented 意味着一種信仰(萬物皆對象)
  • Object-oriented 相信任何軟件都是由對象所構成的,而且Nothing else.
  • 根據上述信仰,電腦語言的設計就簡化了,寫程序只要定義類別(Class)就行了

2. Oriented、Based、Driven、Centered之間的區別?

  • Based 的涵義
    例如:Requirement-based基於需求
    Requirement-base software development

  • Driven 的涵義
    例如:Model-driven(模型引導) 、Use Case-driven(用戶使用引導)
    其實driven 是“引導”,而不是大家常常說說的“驅動”
    就像北極星引導我們,指出方向而已,也像汽車司機(Driver)只是引導汽車方向,並沒有去驅動汽車;而引擎纔是驅動汽車。

  • Centered 的涵義
    例如:Architecture-centered(建築中心)
    一切軟件開發的活動都圍繞着架構,就像聖誕節的糖果和禮物都掛在聖誕樹上一樣(聖誕樹centric)

  • Service-Oriented Architecture(SOA)
    SOA 是什麼含義呢?
    相信軟件都是以服務構成的,Nothing else!

  • 對象(Object)
    對個人而言,所認識的東西,皆對象(不認識的就不是對象)
    認識的東西,就能說出其特點,並與別的對象比較一番。(其特點包括:對象之特徵或屬性(Attribute)、對象之行爲(Behavior))

  • 軟件之對象(Software Object)是由數據(Data)和函數(Function)所組成。

3. 類的用途

  • 類(Class)是羣體(或集合),而對象是類中的一份子。人們常用[是一個](is A)來表達對象與類之間的關係

  • 例如:
    月亮是一個星球
    畢加索是一個藝術家
    畢加索是一個畫家
    張大千是一個畫家

  • 所以[月球]是對象,屬於[星球]類的一個實例(Instance)。畢加索是一個對象,藝術家是一個類,同樣的畫家也是類,其中畫家也是藝術家羣體中的小羣體(部分集合)。畢加索和張大千同屬於[畫家]類,所以具有共同點:精於美術繪畫

  • 類所對應的一羣具有同樣特徵的對象集合。

4. <基類/子類>結構用途 (一)

  • 表達繼承(繼承是擴充的一種)inheritence(繼承、遺產)
    extends 不僅僅是繼承,也是擴充

  • 對衆多對象加以分門別類,就可以形成一個類繼承體系。

  • overrite 其實並沒有複寫,只是名字參數相同,那麼調用的時候,會調用子類的這個方法,不過方法內部可以使用super.xxx方法調用父類的此方法。

5. <基類/子類>結構用途(二)表達組合

  • 組合與被組合結構上有類似繼承的結構(方法相同)
  • 組合之間儘量使用接口(針對接口編程,也是一種協議)

6. <基類/子類> 結構的 接口(卡榫函數 Hook)

  • (卡榫 字義就是 機械上的起定位和固定作用的卡子 ) Interface

  • 所謂Hook,就是接口,如果兩個東西不同時間出現,
    則一方會預留虛空,給予另一邊於未來時刻能以實體來
    填補該空間,兩者虛實相依,就密合起來了。設計優良的卡榫,
    可以讓實體易於新陳代謝、抽換自如(Plug and Play,俗稱PnP:即插即用)

  • Template Method 模板方法模式(GoF)(模板方法)
    這裏寫圖片描述

  • 父類中調用被子類overridable的方法,真是調用的其實是子類的同名同參方法,其實父類的方法依舊是存在的,可以在子類方法中調用super.xxx()實現調用父類此方法。

  • 變與不變的分離(Separate code that changes from the code that doesn’t)是設計卡榫函數及應用框架之基本原則和手藝。

  • 分離出變(Variant)與不變(Invariant)部分之後,就可以將不變部分寫在父類別(Super-class)裏,而變的部分就寫在子類別(Subclass)裏。

  • 繼承與組合都需要Hook Function來對接

7. IoC機制與Default函數

  • 卡榫函數實現IoC機制

  • 控制反轉(IoC:Inversion of Control)
    IoC機制源於OO語言的繼承體系,基類的函數可以主動調用子類的函數,這就是典型的IoC機制。

  • 注:子類調用基類:正向
    基類調用子類:控制反轉

  • 基類與子類之間,控制權是在基類手上,透過Hook函數來調用子類

  • 通常基類是寫在先,而子類則寫在後,這種前輩擁有主導權,進而控制後輩的情形,就統稱爲控制反轉。

  • 默認Default行爲
    基類的重要功能:提供默認(預設)行爲
    基類可事先定義許多[默認](Default)函數,這些默認函數可讓子類來繼承(或調用)之。

8. 主動型vs被動型 API

  • 模塊跟模塊之間 API
    系統跟人之間 UI : User Interface

  • 卡榫函數實現API

  • 主動型API:反向/IOC調用
    被動型API:正向
    (其實是站在父類的角度講的、基類的視角)

  • API的分類
    定義(Define)
    實作(Implement)
    呼叫(Invoke or Call)

  • 根據這三個角度,可捋API區分爲[主動型]與[被動型]兩種。

  • 被動型缺乏彈性

  • API >= 控制力
    接口(interface)是雙方接觸的地方,也是雙方勢力或
    地盤的界限。誰擁有接口的指定權,誰就掌握控制點,掌握了主動權。

  • Activity onCreate 就是一種主動型的API

9. 結語&複習:接口與類(別)

  • 在OOP裏,將接口定義爲一種特殊的類別(Class)

  • 在C++裏,類別包括3種:
    1.一般(具象)類別
    所有函數都是具象(內有指令)
    2.抽象(abstract)類別
    有一個或多個函數是抽象的(內無指令)
    3.純粹抽象(pure abstract)類別
    所有函數都是抽象的(java 中 的 接口)

  • 在UML裏,以圓圈來表示接口


一、面向對象編程思想:封裝、繼承、多肽、六大基本原則、設計模式等等。。。

二、面向對象的六大基本原則包括哪些?

  1. 單一職責原則
  2. 開閉原則
    –對擴展開放,對修改關閉
  3. 里氏替換原則
    –使用“抽象(Abstraction)”和“多態(Polymorphism)”將設計中的靜態結構改爲動態結構,維持設計的封閉性

  4. 依賴倒置原則
    A.高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。
    B.抽象不應該依賴於具體,具體應該依賴於抽象。

  5. 接口隔離原則
    –客戶端不應該依賴它不需要的接口;一個類對另一個類的依賴應該建立在最小的接口上。

  6. 迪米特法則
    –最少知識原則(Least Knowledge Principle 簡寫LKP),就是說一個對象應當對其他對象有儘可能少的瞭解,不和陌生人說話

三、單一職責原則

SRP:Single Responsibility Principle

--ImageLoader案例
 圖片顯示、圖片緩存、圖片下載功能分開

(思維方式)利他之心,我們寫代碼是給別人看的,是給別人用的

四、開閉原則

類、某塊、函數等等.....(可擴展、不可修改)
對擴展開放,對修改關閉
發佈了39 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章