设计模式(一)预备知识
前言
學習設計模式需要有面向對象編程的基礎,要基本掌握一種面向對象的編程語言。關于面向對象編程思想,我們有另外一篇文章專門講解:面向過程和面向對象的聯系和區別。
知識點
虛函數
在類的成員函數定義中,形式上為定義為virtual的函數叫虛函數。
如果虛函數后面有“= 0”,這個虛函數就是純虛函數。
虛函數本身并不是一個真正的函數,它沒有自己的函數地址。調用虛函數實際上是先去虛函數表中找函數指針,再進行調用。
對于虛函數,在運行時,基類會將虛函數表中的函數指針初始化為自己的函數地址;子類初始化時,會將其初始化為子類自己的函數地址,達到函數覆蓋的效果。
對于純虛函數,基類沒有定義,所以基類只會將虛函數表中的函數指針初始化為NULL;子類初始化時,會將其初始化為子類自己的函數地址,達到函數覆蓋的效果。
虛基類
包含純虛函數的類,叫做虛基類。
多態
多態是指,當基類指針指向子類對象時,使用基類指針調用基類定義的虛函數,實際上調用的是此虛函數的子類實現。顯然,多態是使用虛函數實現的。
繼承
面向對象語言三大特性之一,這里不做詳細說明。
接口
包含一系列虛函數的類,就叫做接口。它只定義函數,不關心如何實現。具體的功能實現任務交給繼承自此接口的子類完成。接口正是利用的面向對象語言的多態特性。
接口,顧名思義,它連接了功能使用者和功能實現者,是負責二者之間交互的類,也是一種實現二者解耦的重要方法。
模塊化
模塊化是軟件開發中無處不在的軟件架構技術。它的核心思想是分而治之,即將一個大問題劃分為相對獨立的小問題,化繁為簡,逐個擊破,并最終通過模塊間分工協作完成預期功能。
模塊化思想存在于計算機技術的方方面面,各個層次。例如:
從硬件上來說,
- 計算機是由多個零部件組裝而成的,每個零部件就是一個模塊。存儲器用于存儲數據,CPU用于計算,輸入輸出設備用于數據交互;
從軟件上來說,
- 一個函數就可以看做是一個模塊,它通過計算解決了某一個小問題;
- 再向上一級,一個類就是一個模塊,它通過將屬性和方法封裝起來,實現了一個具有某類功能的功能模塊。
- 再向上一級,一個庫(動態庫或靜態庫)就是一個模塊,它將某一問題領域所有的解決方案接口封裝在一起,例如FFmpeg音視頻處理庫、pthread多線程庫、zlib壓縮庫等等。
- 再向上一級,每一個軟件本身,也是一個模塊,這個軟件為解決某一領域內的問題,提供了完整的交互流程、各個方面的功能。
- 再向上一級,到分布式系統中,某一計算機集群也是一個模塊,它是為了穩定地對外提供某一種計算服務。
- 以此類推。
模塊化無處不在,是人類處理復雜問題的法寶。模塊化除了可以降低系統復雜度,模塊化還便于多人協作。當系統模塊化分解以后,各個模塊的制作可以同時進行,并行開發,大大加快系統開發進度。
封裝
下面來說說封裝。封裝是實現模塊化的核心技術。
封裝是隱藏一些東西,暴露一些東西。正是有一些東西被隱藏起來,才實現了問題的簡化。暴露出來的東西的數量相對于隱藏起來的東西的數量微乎其微。使用者只需要關心暴露出來的接口如何使用即可。當每個模塊都能使問題復雜度收斂,那么系統整體的復雜度就會下降,整個系統就能做得很大,實現起來也更容易。
結語
本文講解了學習設計模式所需要的預備知識,這些預備知識是理解設計模式的基礎,同時這些知識也是貫穿軟件開發過程中的核心理念,必須要多思考多理解多應用。
本文原創首發于微信公眾號:Qt未來工程師。
總結
以上是生活随笔為你收集整理的设计模式(一)预备知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡冻结会产生年费吗 信用卡冻结后还收
- 下一篇: 信用卡年费什么时候扣 信用卡什么时候扣年