本篇是根據高煥堂老師的課程歸納記錄的,所講內容包括: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 developmentDriven 的涵義
例如: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裏,以圓圈來表示接口
一、面向對象編程思想:封裝、繼承、多肽、六大基本原則、設計模式等等。。。
二、面向對象的六大基本原則包括哪些?
- 單一職責原則
- 開閉原則
–對擴展開放,對修改關閉 里氏替換原則
–使用“抽象(Abstraction)”和“多態(Polymorphism)”將設計中的靜態結構改爲動態結構,維持設計的封閉性依賴倒置原則
A.高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。
B.抽象不應該依賴於具體,具體應該依賴於抽象。接口隔離原則
–客戶端不應該依賴它不需要的接口;一個類對另一個類的依賴應該建立在最小的接口上。迪米特法則
–最少知識原則(Least Knowledge Principle 簡寫LKP),就是說一個對象應當對其他對象有儘可能少的瞭解,不和陌生人說話
三、單一職責原則
SRP:Single Responsibility Principle
--ImageLoader案例
圖片顯示、圖片緩存、圖片下載功能分開
(思維方式)利他之心,我們寫代碼是給別人看的,是給別人用的
四、開閉原則
類、某塊、函數等等.....(可擴展、不可修改)
對擴展開放,對修改關閉