重溫設計模式系列(二)面向對象基礎知識

本文摘要設計模式

文章介紹了面向對象的基礎知識,對象,類,抽象,接口等基本概念,面向對象的三大特徵以及UML類圖的基礎知識,做爲後續文章的基礎。架構

 

名詞解釋ide

一、抽象:一種思惟方式,把具體事物的簡單化,歸納性描述。函數

二、UML:通用建模語言spa

 

一、對象和類設計

1.1 對象code

在面向對象的世界裏,萬物皆是對象,動物是對象,植物是對象,對象的本質是什麼呢?對象是一個真實存在的事物。好比一個杯子,一碗水都是對象。對象

用對象的方式描述事物,與面向過程方式來說,更容易理解,更符合人們的思惟習慣。blog

1.2 類繼承

類是對象的抽象,好比一隻小狗,一隻小貓,他們的抽象是動物類,也就是說一隻小狗,一隻小貓是屬於動物的一類。

1.3 類與對象的關係

類是對象的抽象,對象是類的實例。一個類能夠有多個對象,但一個對象可能只屬於一個類。在UML中有類圖和對象圖的概念。示例以下(更多知識,請自我補充):

1.4 思惟過程

經過各個對象找到其共同點,把相同的對象歸爲一類,就是面向對象的基本思惟過程。好比張三,李四是具體的對象,他們都是人類。所以能夠抽象出人這個類。

1.5 類的構成

一個類主要有屬性和方法(類名,靜態塊等不展開講),通稱爲類的成員,屬性表達類的數據部分,方法表示類的行爲。好比類Person有name,age等屬性,walk(),run()方法。

1.6 類的幾個重要概念

(1)實例化 :建立一個對象,通常用new的方式。如:Person tom=new Person();

(2)構造函數:每一個類默認有一個公用構造函數,也能夠自定義構造函數,通常用於給成員變量賦值或執行一些初始化方法。

(3)重載:一個方法有多個不一樣個數,不一樣類型,不一樣順序的參數的方法,稱爲方法的重載。

好比:

public void hello(){}
public void hell(String name){}
public void hello(int index){}

(4)重寫:關鍵字Override,指子類重寫(覆蓋)父類的方法,用於改變父類方法的行爲。通常用於多態實現。

1.7 接口

類包含數據或行爲,但接口是一種契約,主要定義接口的行爲,沒有方法體,須要類實現接口。通常用於定義規範(抽象行爲)和實現鬆耦合架構。

使用方式:

接口的使用很靈活,能夠接口中定義1個或多個方法,一個類能夠實現多個接口,但只能繼承一個類。

1.8 抽象類

抽象類使用abstract定義,通常用於定義多個類共同擁有的代碼。抽象類能夠定義抽象方法也能夠定義方法體。通常在項目中,用於定義公用代碼或定義公用結構,好比模版模式。

 

二、三大特徵

2.1 封裝

定義:把與本身相關的數據和行爲放到一個類中,對外提供且僅提供必要方法。

解決的問題:隱藏內部細節,提供有限訪問接口,使代碼內聚,提升易用性

存在的問題:不一樣的類中,會有相同代碼,代碼冗餘會多,須要對這些代碼進行抽象設計

2.2 繼承

定義:是一種父子關係,子類繼承父類的公有和受保護做用域代碼,能夠重寫父類代碼,也能夠自定義本身的代碼。繼承表達的是一種is a的關係。

類圖:

解決的問題:代碼複用問題,子類複用父類代碼,減小代碼量,提升可維護性。

存在的問題:

一、父類增長的任何公有或受保護方法都被子類繼承,會致使子類有其不須要的行爲。

二、繼承關係,若是不進行控制,會形成多級繼承,當某一父類修改後,影響子類的調用(很容易搞錯,是否是該子類應該擁有的)。影響代碼的可維護性。

2.3 多態

定義:一個接口有多種不一樣的實現

解決的問題:屏蔽了各種之間的差別,方便寫出通用性強的邏輯,提升代碼的靈活性和擴展性。

存在的問題:

一、實現類須要遵循接口的行爲約定,不然會出現不匹配的狀況。好比:eat()方法原來的意圖是定義吃的邏輯,實現時寫成了play的邏輯。

二、增長了代碼和維護的複雜性。

 

三、類之間的關係

3.1 泛化關係

泛化是特殊/通常的關係,通常是指繼承關係,用於定義父子關係。

3.2 關聯關係

類與類之間有一種引用關係,通常有依賴,聚合,組合三種關係。

依賴:一種須要,好比人須要空氣,這就是一種依賴。

聚合:一種弱擁有關係(總體與部分的關係),可是二者的生命週期不一樣,大雁與雁羣的關係,就是一種聚合關係。

組合:一種強擁有關係(總體與部分的關係),二者的生命週期相同,好比車與發動機的關係,發動起報廢了,車也就報廢了。

3.3 高內聚,鬆耦合

高內聚:是指類內部元素之間的關係,好的內聚是具有良好的封裝性,指類內部的數據和行爲有且僅是其擁有的,對外只提供必要的訪問接口你。通常好的內聚性,更利於維護和複用,只要接口不變,內部如何變化都不須要客戶端變。

鬆耦合:是指類與類之間的關係,好的耦合應該是儘可能少的依賴,若是不必就不產生依賴。通常設計中,採用聚合組合或依賴接口而不是依賴具體實現,隔離這種變化。好比繼承,實際上就是一種強耦合關係,若是解決這種耦合,能夠採用聚合組合的方式。也就是設計原則中的合成複用原則(後面講設計原則時會具體講)

 

四、面向對象的通常過程

(1)找對象

(2)抽象類

(3)定義類屬性

(4)定義類關係

(5)設計檢查

 

五、UML類圖

5.1基本元素

(1)類圖

類圖包含類的名稱、屬性和方法定義。

類的可見性修飾符:

# protected

無修飾符爲 internal

(2)接口

通常只定義接口方法。

5.2元素關係

(1)關聯

A 和 B 相互調用和訪問對方的元素。

(2)依賴

B 的變化會影響 A,則 A 依賴於 B。

(3)聚合

A 中擁有一個 B,但 B 脫離於 A 仍然能夠獨立存活。

(4)組合

A 中擁有一個 B,B和A屬於同一輩子命週期,B 脫離 A 後在系統中沒有任何存活的意義。

(5)泛化

泛化是一種繼承關係,能夠是類繼承或接口繼承。

(6)實現

接口和實現類之間的關係。

 

下篇預告

重溫設計模式系列(三)面向對象設計原則

摘要:比設計模式更重要的是設計思想和設計原則,基於這些原則,逐步產生了不一樣的設計模式。所以,學好設計模式的基礎是掌握基本的設計原則。大綱以下:

一、代碼抽象三原則

二、GRASP原則

三、SOLID原則

四、SOC原則

相關文章
相關標籤/搜索