1. 從面向過(guò)程到面向?qū)ο?/h4>
早期計(jì)算機(jī)編程是基于面向過(guò)程的(如C語(yǔ)言),通過(guò)設(shè)計(jì)一個(gè)算法就可以解決當(dāng)時(shí)的問(wèn)題。隨著計(jì)算機(jī)技術(shù)的不斷提高,計(jì)算機(jī)被用于解決越來(lái)越復(fù)雜的問(wèn)題。面對(duì)復(fù)雜的業(yè)務(wù)關(guān)系,不斷變化的業(yè)務(wù)流程,面向過(guò)程的設(shè)計(jì)與現(xiàn)實(shí)已經(jīng)難以應(yīng)付這些問(wèn)題。
面向?qū)ο蟮乃枷耄?strong>就是一切事物皆對(duì)象,通過(guò)面向?qū)ο蟮姆绞剑瑢F(xiàn)實(shí)世界的事物抽象成對(duì)象,將現(xiàn)實(shí)世界中的關(guān)系抽象成類、繼承,實(shí)現(xiàn)對(duì)現(xiàn)實(shí)世界的抽象與建模。
面向?qū)ο笙啾让嫦蜻^(guò)程的優(yōu)勢(shì):
- 結(jié)構(gòu)清晰:面向?qū)ο蟮木幊讨校瑢?duì)象被賦予屬性和方法,更接近現(xiàn)實(shí)世界事物,更容易理解和維護(hù)。
- 封裝性: 面向?qū)ο罅己玫姆庋b性優(yōu)勢(shì)表現(xiàn)為其對(duì)內(nèi)部的修改,對(duì)外界產(chǎn)生影響較小。
- 易拓展性: 面向?qū)ο缶幊蹋a更好的被重用,更容易進(jìn)行拓展,可以更好的應(yīng)對(duì)業(yè)務(wù)的變化。
面向?qū)ο笙啾让嫦蜻^(guò)程的劣勢(shì):
- 增加的工作量: 如果一味地強(qiáng)調(diào)封裝,當(dāng)修改對(duì)象內(nèi)部時(shí),對(duì)象的任何屬性都不允許外部直接存取,則要增加許多沒(méi)有其他意義、只負(fù)責(zé)讀或?qū)懙男袨椤_@會(huì)為編程工作增加負(fù)擔(dān),增加運(yùn)行開(kāi)銷,并且使程序顯得臃腫。
- 性能低: 由于面向?qū)ο蟾叩倪壿嫵橄螅沟妹嫦驅(qū)ο笤趯?shí)現(xiàn)的時(shí)候,不得不做出性能上面的犧牲,計(jì)算時(shí)間和空間存儲(chǔ)大小的都開(kāi)銷很大。
面向?qū)ο蟮膬?yōu)點(diǎn):
- 代碼開(kāi)發(fā)模塊化,更易維護(hù)和修改。
- 代碼復(fù)用性。
- 增強(qiáng)代碼的可靠性和靈活性。
- 增加代碼的可理解性。
2. 面向?qū)ο蟮乃膫€(gè)特性
-
抽象
抽象描述了一個(gè)對(duì)象的基本特征,可以將這個(gè)對(duì)象與所有其他類型的對(duì)象區(qū)分開(kāi)來(lái),因此提供了清晰定義的概念邊界。抽象關(guān)注一個(gè)對(duì)象的外部視圖,用來(lái)分離對(duì)象的基本行為和實(shí)現(xiàn)。我們可以理解為抽象關(guān)注接口,即可觀察到的行為;而封裝則關(guān)注這些行為的實(shí)現(xiàn)。
抽象的兩個(gè)原則:
- 最少承諾原則:對(duì)象的接口只提供它的基本行為。
- 最少驚奇原則:抽象捕捉了某個(gè)對(duì)象的全部行為,不多也不少,并且不提供抽象之外的驚奇效果和副作用。
評(píng)判抽象的品質(zhì):
耦合:模塊之間的關(guān)聯(lián)強(qiáng)度應(yīng)該是比較弱的,即低耦合。
內(nèi)聚:模塊內(nèi)的各個(gè)元素的聯(lián)系時(shí)緊密的,即高內(nèi)聚。
充分性:類或模塊應(yīng)該記錄某個(gè)抽象足夠多的特征,從而允許有意義的、有效的交互。
完整性:類和模塊的接口記錄了它的全部特征。
基礎(chǔ)性:只有訪問(wèn)該抽象的底層表現(xiàn)形式才能夠有效的實(shí)現(xiàn)那些操作。
封裝
封裝給對(duì)象提供了隱藏內(nèi)部屬性和行為的能力,對(duì)象提供一些能被其他對(duì)象訪問(wèn)的方法來(lái)改變它內(nèi)部的數(shù)據(jù)。在Java當(dāng)中,有3種修飾符:public,private和protected。每一種修飾符給其他的位于同一個(gè)包或者不同包下面對(duì)象賦予了不同的訪問(wèn)權(quán)限。正是由于封裝機(jī)制,程序在使用某一對(duì)象時(shí)不需要關(guān)心該對(duì)象的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)及實(shí)現(xiàn)操作的方法。使用封裝能隱藏對(duì)象實(shí)現(xiàn)細(xì)節(jié),使代碼更易維護(hù),同時(shí)因?yàn)椴荒苤苯诱{(diào)用、修改對(duì)象內(nèi)部的私有信息,在一定程度上保證了系統(tǒng)安全性。
封裝優(yōu)點(diǎn):
通過(guò)隱藏對(duì)象的屬性來(lái)保護(hù)對(duì)象內(nèi)部的狀態(tài)。
提高了代碼的可用性和可維護(hù)性,因?yàn)閷?duì)象的行為可以被單獨(dú)的改變或者是擴(kuò)展。
禁止對(duì)象之間的不良交互提高模塊化。
繼承
就像現(xiàn)實(shí)中,孩子會(huì)繼承父母的一些特征,面向?qū)ο笫褂美^承機(jī)制實(shí)現(xiàn)代碼的復(fù)用,多個(gè)類所公用的代碼部分可以只在一個(gè)類中提供,而其他類只需要繼承即可。繼承給對(duì)象提供了從基類獲取字段和方法的能力,繼承提供了代碼的重用性,也可以在不修改類的情況下給現(xiàn)存的類添加新特性。多態(tài)
多態(tài)指相同的操作或函數(shù)、過(guò)程可作用于多種類型的對(duì)象上并獲得不同的結(jié)果。不同的對(duì)象,收到同一消息可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性。
實(shí)現(xiàn)多態(tài),有二種方式,覆蓋,重載。
覆蓋: 指子類重新定義父類的虛函數(shù)的做法。
- 重載: 指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。
抽象和封裝的不同點(diǎn)
抽象和封裝是互補(bǔ)的概念:一方面,抽象關(guān)注對(duì)象的行為。另一方面,封裝關(guān)注對(duì)象行為的細(xì)節(jié)。一般是通過(guò)隱藏對(duì)象內(nèi)部狀態(tài)信息做到封裝,因此,封裝可以看成是用來(lái)提供抽象的一種策略。
3. 面向?qū)ο笪宕笤O(shè)計(jì)原則
單一職責(zé)原則(SRP)
一個(gè)類應(yīng)該僅有一個(gè)引起它變化的原因,這意味著一個(gè)類應(yīng)該只做一件事情。開(kāi)放封閉原則(OCP)
對(duì)象或?qū)嶓w應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。里氏替換原則(LSP)
子類可以替換父類并且出現(xiàn)在父類能夠出現(xiàn)的任何地方。依賴倒置原則(DIP)
實(shí)體必須依靠抽象而不是具體實(shí)現(xiàn)。它表示高層次的模塊不應(yīng)該依賴于低層次的模塊,它們都應(yīng)該依賴于抽象。接口隔離原則(ISP)
不應(yīng)強(qiáng)迫客戶端實(shí)現(xiàn)一個(gè)它用不上的接口,所以,使用多個(gè)專門的接口比使用單個(gè)接口要好的多。
參考引用:
1. http://blog.csdn.net/luoxinwu123/article/details/8446094
2. http://www.cnblogs.com/ysyn/p/3380856.html
3. http://www.importnew.com/10980.html
4. http://blog.jobbole.com/86267/