轉載請注明原文地址: https://www.cnblogs.com/ygj0930/p/10828210.html
一:從 面向過程 走向 面向對象
在早期進行軟件開發的時候,計算機配置低、內存小,節省內存成了首要目標,哪怕是運行的時間長些也無所謂,由此誕生的“面向過程編程”采取“時間換空間”的策略,少存儲、運算過程中涉及到的數據都在內存中暫存,直至運算結束。
隨着技術的發展,存儲不再成為瓶頸。相反,如何更好地模擬世界、表達世界、提高系統的可維護性等問題越顯重要,於是面向對象設計應運而生。
到目前為止,運行在PC上的程序由於不太需要考慮硬件的限制,而系統的可維護性等方面卻要求很高,一般采用面向對象方式進行開發;
而對於內存限制有較高要求的嵌入式系統,則大多采用面向過程方式進行設計編程。
二:面向過程編程——為解決問題而生,一個函數一個目的
面向過程編程是 將要解決的問題分解為一個個要解決的 步驟,然后 用函數 把這些步驟一步一步的實現,然后再一一調用函數,解決問題。
例如:五子棋游戲
1、開始游戲
2、黑子先走,
3、繪制畫面,
4、判斷輸贏,
5、輪到白子,
6、繪制畫面,
7、判斷輸贏,
8、返回步驟2,
9、輸出最后結果。
把上面每個步驟用分別的函數來實現,問題就解決了。
三:面向對象編程——將解決問題的過程抽象為多個對象協同作戰的過程
面向對象編程則是把構成問題的事務分解成各個 對象,而建立對象的目的也不是單純為了完成一個個步驟,而是為了描述某個事物在解決整個問題的過程中所發生的行為,對象中可能不只一個行為(函數),還會有其他的用於描述或者解決其他問題的屬性、行為。
面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分為:
1、棋子對象,這兩方的行為是一模一樣的,
2、棋盤對象,負責繪制畫面,
3、規則對象,負責判定諸如犯規、輸贏等。
面向對象三大特性:封裝、繼承、多態
封裝:將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。
繼承:繼承是類與類的一種關系,子類擁有父類的所有屬性和方法(除了private修飾的屬性不能擁有)從而實現了實現代碼的復用。
多態:主要指引用多態、方法多態。
引用多態是指:父類引用可以指向本類對象,也可指向子類對象;
方法多態:子類中可以重寫父類的方法,在調用方法時根據引用指向的子類對象決定調用哪個具體的方法。
面向對象五大基本原則
單一職責原則:一個類的功能要單一,不能包羅萬象。
開放封閉原則:一個模塊在擴展性方面應該是開放的而在更改性方面應該是封閉的,比如:一個網絡模塊,原來只服務端功能,而現在要加入客戶端功能,那么應當在不用修改服務端功能代碼的前提下,就能夠增加客戶端功能的實現代碼,這要求在設計之初,就應當將服務端和客戶端分開,公共部分抽象出來。
里氏替換原則:子類應當可以替換父類並出現在父類能夠出現的任何地方。比如:公司搞年度晚會,所有員工可以參加抽獎,那么不管是老員工還是新員工,也不管是總部員工還是外派員工,都應當可以參加抽獎,否則這公司就不和諧了。
依賴倒置原則:具體依賴抽象,上層依賴下層。比如:假設B是較A低的模塊,但B需要使用到A的功能,這個時候,B不應當直接使用A中的具體類: 而應當由B定義一抽象接口,並由A來實現這個抽象接口,B只使用這個抽象接口:這樣就達到了依賴倒置的目的,B也解除了對A的依賴,反過來是A依賴於B定義的抽象接口。通過上層模塊難以避免依賴下層模塊,假如B也直接依賴A的實現,那么就可能 造成循環依賴。一個常見的問題就是編譯A模塊時需要直接包含到B模塊的cpp文件,而編譯B時同樣要直接包含到A的cpp文件。
接口分離原則:模塊間要通過抽象接口隔離開,而不是通過具體的類強耦合起來。
四:面向服務的誕生
面向服務編程是基於“系統開發”層面而言的。如果是面向過程、面向對象編程是為了解決一個問題,那么面向服務開發則是為了實現一個系統、一個程序。
一個系統或應用程序的功能是 由一些松耦合並且具有統一接口定義方式的組件(也就是 服務) 提供的,一個功能由一個服務來提供,多個服務組合而成系統/程序。
五:面向切面編程(AOP)
將通用需求功能從不相關類之中分離出來,成為一個行為。
同時,使得很多類共享一個行為,一旦行為發生變化,不必修改很多類,只要修改這個行為就可以。
切面的意思就是:將一系列類作為平面,有共享行為的類以“行為”為切點相切。

