設計模式無招勝有招之設計技術-面向對象設計語言支持

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/thirtyfive16/article/details/51556383

  面向對象的設計語言提供了很多和對象相關的技術。

  面向對象的基本特徵,封裝繼承和多態;JAVA裏面提供了反射;函數重載;C++裏面的模板;多重繼承;接口繼承;抽象類等等。

  這些技術在面向對象設計的時候能夠在可擴展性上提供最基礎的支持。


1 封裝

在面向對象的程序設計出現之前,流行的是面向過程的程序設計。所謂的面向過程是指把要解決的問題分爲幾個步驟,每個步驟按照順序執行。其中,每個步驟還可以劃分爲更小的步驟。每個步驟可以用一個函數來實現。用現在的話講,就是面向函數編程。在這種編程中,函數是編程的中心。當拿到需求後,把需求分解爲按照順序執行的函數。可以看到設計的中心在函數,而數據只是輔助。且數據和函數是分離的。任何一個函數可以調用任何一個變量數據。

這種設計方式不適合越來越複雜的大型應用和需求。隨着經驗的增加,人們發現,數據和函數之間的邏輯聯繫比函數之間強。於是把數據和函數放在一個邏輯塊中的願望越來越強烈。面向對象的設計就慢慢誕生了。

封裝是面向對象的第一個特徵。封裝就是把有邏輯聯繫的數據和函數組織在一塊。

封裝帶來的 好處:

1)  組織性:類把數據和函數組織在了一起,這樣使得代碼更清晰,更有邏輯和組織。

2)  邏輯性:從類的內部看,封裝就是增加了邏輯性

3)  隱藏性:從類的外部看,即類的使用者的角度看,類把它的內部和外部隔離開來。類可以使得類外部的變化不影響類的內部,也可以使得類內部有限暴露給外部的使用者。

在後面看到,設計模式中最重要的重構手段就是“封裝變化”。這個後面再講。

2 繼承

面向過程的編程還有一個問題是代碼的可重用性。

繼承使得子類可以重用、修改和增加父類的功能(函數)。

但是隨着人們實踐經驗的增加,人們逐漸發現繼承被濫用了。繼承是一種強依賴,子類對父類的強依賴。父類的變化會導致子類的急劇的變化。因此後面又一個新的重構的原則就是“優先使用組合而不是繼承”。

繼承被限制在接口繼承上,而不是實現繼承。


3 多態

多態是最後被加到C++中的一個特性。當多態出現的時候,引起了很大 爭論。人們認爲多態是沒有必要的一個特性。當然今天,人們普遍認爲多態是面向對象設計的核心。

多態是指擁有相同接口的對象在運行時候,可以相互替換。定義了一組有相同接口的父類和子類。在語法層面,父類可以指向子類。於是在靜態編譯期間,你看到執行了一個函數。但是你並不知道是執行的那個函數。直到運行時刻,這個父類指向的是哪個子類才能確定下來。且這個指向的子類是可以隨時替換的。

也就是說當你寫好了“執行父類指針調用函數後”,在不改變這段代碼的前提下,只要你能夠使得指針指向不同的子類,那麼就會有不同的執行結果。當需求發生改變的時候,你不必要改代碼,只要增加一個實現需求的子類,就可以完成需求的變更。

這個就是後面所有的面向對象設計的基本原理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章