天青色等煙雨赋秀,而我在等你。 ——《青花瓷》
注:天青色是無法自己形成的,在青瓷出爐的那一瞬必須是煙雨天,釉色才會(huì)漸變成夢(mèng)幻般的天青色.因此雨過天晴的瓷器極為珍惜.
面向?qū)ο蟮娜齻€(gè)特征
封裝?
? ? ? 將客觀事物封裝成抽象的類篮撑,并且類可以將自己的屬性或者方法讓他信任的類或者對(duì)象訪問。
在Java中類中成員的屬性有:public匆瓜, protected赢笨, <default>, private驮吱,這四個(gè)屬性的訪問權(quán)限依次降低茧妒。
public:對(duì)所有的類和對(duì)象開放,都可以直接調(diào)用左冬;
protected:類內(nèi)部桐筏,同一個(gè)包內(nèi)或者子類。
??<default>:及不添加修飾符拇砰,選擇默認(rèn)梅忌。只對(duì)類內(nèi)部或者同一包內(nèi)的開放狰腌。
?private:只有類內(nèi)部可用。
繼承
? ? ?繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能牧氮,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展琼腔。
? 實(shí)現(xiàn)繼承的方式有兩種,繼承類或者實(shí)現(xiàn)接口踱葛。只能繼承一個(gè)類但是可以實(shí)現(xiàn)多個(gè)接口展姐。
? ?拓展:上面提到private修飾的屬性或者方法子類也是不可以直接調(diào)用的。但是在子類被實(shí)例化的時(shí)候會(huì)先調(diào)用父類的構(gòu)造方法剖毯,初始化父類圾笨,然后加上子類特有的屬性和方法,合起來生成子類逊谋。所以說子類繼承或擁有父類所有的屬性和方法是正確的擂达,只是對(duì)私有的不能直接調(diào)用。
多態(tài)
? 所謂多態(tài)就是指一個(gè)類實(shí)例的相同方法在不同情形有不同表現(xiàn)形式胶滋。
? 實(shí)現(xiàn)多態(tài)板鬓,有二種方式,覆蓋究恤,重載俭令。
? 覆蓋,是指子類重新定義父類的虛函數(shù)的做法部宿。
? ?重載抄腔,是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同理张,或許參數(shù) 類型不同赫蛇,或許兩者都不同)。
面向?qū)ο蟮奈宕笤瓌t
注:此處為引用其他博主的內(nèi)容雾叭。感覺清晰易懂悟耘,所以摘抄到此處供自己學(xué)習(xí)。附相應(yīng)的連接(如需刪除請(qǐng)聯(lián)系本人):
單一職責(zé)原則(Single-Resposibility Principle)
其核心思想為:一個(gè)類织狐,最好只做一件事暂幼,只有一個(gè)引起它的變化。單一職責(zé)原則可以看做是低耦合移迫、高內(nèi)聚在面向?qū)ο笤瓌t上的引申旺嬉,將職責(zé)定義為引起變化的原因,以提高內(nèi)聚性來減少引起變化的原因起意。職責(zé)過多鹰服,可能引起它變化的原因就越多,這將導(dǎo)致職責(zé)依賴,相互之間就產(chǎn)生影響悲酷,從而大大損傷其內(nèi)聚性和耦合度套菜。通常意義下的單一職責(zé),就是指只有一種單一功能设易,不要為類實(shí)現(xiàn)過多的功能點(diǎn)逗柴,以保證實(shí)體只有一個(gè)引起它變化的原因。 專注顿肺,是一個(gè)人優(yōu)良的品質(zhì)戏溺;同樣的,單一也是一個(gè)類的優(yōu)良設(shè)計(jì)屠尊。交雜不清的職責(zé)將使得代碼看起來特別別扭牽一發(fā)而動(dòng)全身旷祸,有失美感和必然導(dǎo)致丑陋的系統(tǒng)錯(cuò)誤風(fēng)險(xiǎn)。
開放封閉原則(Open-Closed principle)
其核心思想是:軟件實(shí)體應(yīng)該是可擴(kuò)展的讼昆,而不可修改的托享。也就是,對(duì)擴(kuò)展開放浸赫,對(duì)修改封閉的闰围。開放封閉原則主要體現(xiàn)在兩個(gè)方面1、對(duì)擴(kuò)展開放既峡,意味著有新的需求或變化時(shí)羡榴,可以對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況运敢。2校仑、對(duì)修改封閉,意味著類一旦設(shè)計(jì)完成者冤,就可以獨(dú)立完成其工作肤视,而不要對(duì)其進(jìn)行任何嘗試的修改。 實(shí)現(xiàn)開開放封閉原則的核心思想就是對(duì)抽象編程涉枫,而不對(duì)具體編程,因?yàn)槌橄笙鄬?duì)穩(wěn)定腐螟。讓類依賴于固定的抽象愿汰,所以修改就是封閉的;而通過面向?qū)ο蟮睦^承和多態(tài)機(jī)制乐纸,又可以實(shí)現(xiàn)對(duì)抽象類的繼承衬廷,通過覆寫其方法來改變固有行為,實(shí)現(xiàn)新的拓展方法汽绢,所以就是開放的吗跋。 “需求總是變化”沒有不變的軟件,所以就需要用封閉開放原則來封閉變化滿足需求,同時(shí)還能保持軟件內(nèi)部的封裝體系穩(wěn)定跌宛,不被需求的變化影響酗宋。
Liskov替換原則(Liskov-Substitution Principle)
其核心思想是:子類必須能夠替換其基類。這一思想體現(xiàn)為對(duì)繼承機(jī)制的約束規(guī)范疆拘,只有子類能夠替換基類時(shí)蜕猫,才能保證系統(tǒng)在運(yùn)行期內(nèi)識(shí)別子類,這是保證繼承復(fù)用的基礎(chǔ)哎迄。在父類和子類的具體行為中回右,必須嚴(yán)格把握繼承層次中的關(guān)系和特征,將基類替換為子類漱挚,程序的行為不會(huì)發(fā)生任何變化翔烁。同時(shí),這一約束反過來則是不成立的旨涝,子類可以替換基類租漂,但是基類不一定能替換子類。 Liskov替換原則颊糜,主要著眼于對(duì)抽象和多態(tài)建立在繼承的基礎(chǔ)上哩治,因此只有遵循了Liskov替換原則,才能保證繼承復(fù)用是可靠地衬鱼。實(shí)現(xiàn)的方法是面向接口編程:將公共部分抽象為基類接口或抽象類业筏,通過Extract Abstract Class,在子類中通過覆寫父類的方法實(shí)現(xiàn)新的方式支持同樣的職責(zé)鸟赫。 Liskov替換原則是關(guān)于繼承機(jī)制的設(shè)計(jì)原則蒜胖,違反了Liskov替換原則就必然導(dǎo)致違反開放封閉原則。 Liskov替換原則能夠保證系統(tǒng)具有良好的拓展性抛蚤,同時(shí)實(shí)現(xiàn)基于多態(tài)的抽象機(jī)制台谢,能夠減少代碼冗余,避免運(yùn)行期的類型判別岁经。
依賴倒置原則(Dependecy-Inversion Principle)
其核心思想是:依賴于抽象朋沮。具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象缀壤;抽象不依賴于具體樊拓,具體依賴于抽象。 我們知道塘慕,依賴一定會(huì)存在于類與類筋夏、模塊與模塊之間。當(dāng)兩個(gè)模塊之間存在緊密的耦合關(guān)系時(shí)图呢,最好的方法就是分離接口和實(shí)現(xiàn):在依賴之間定義一個(gè)抽象的接口使得高層模塊調(diào)用接口条篷,而底層模塊實(shí)現(xiàn)接口的定義骗随,以此來有效控制耦合關(guān)系,達(dá)到依賴于抽象的設(shè)計(jì)目標(biāo)赴叹。 抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性鸿染,因?yàn)槌橄笫遣蛔兊模蕾囉诔橄笫敲嫦驅(qū)ο笤O(shè)計(jì)的精髓稚瘾,也是依賴倒置原則的核心牡昆。 依賴于抽象是一個(gè)通用的原則,而某些時(shí)候依賴于細(xì)節(jié)則是在所難免的摊欠,必須權(quán)衡在抽象和具體之間的取舍,方法不是一層不變的些椒。依賴于抽象播瞳,就是對(duì)接口編程免糕,不要對(duì)實(shí)現(xiàn)編程牌芋。
接口隔離原則(Interface-Segregation Principle)
其核心思想是:使用多個(gè)小的專門的接口躺屁,而不要使用一個(gè)大的總接口。 具體而言烁兰,接口隔離原則體現(xiàn)在:接口應(yīng)該是內(nèi)聚的耐亏,應(yīng)該避免“胖”接口。一個(gè)類對(duì)另外一個(gè)類的依賴應(yīng)該建立在最小的接口上沪斟,不要強(qiáng)迫依賴不用的方法广辰,這是一種接口污染。 接口有效地將細(xì)節(jié)和抽象隔離币喧,體現(xiàn)了對(duì)抽象編程的一切好處轨域,接口隔離強(qiáng)調(diào)接口的單一性。而胖接口存在明顯的弊端杀餐,會(huì)導(dǎo)致實(shí)現(xiàn)的類型必須完全實(shí)現(xiàn)接口的所有方法、屬性等朱巨;而某些時(shí)候史翘,實(shí)現(xiàn)類型并非需要所有的接口定義,在設(shè)計(jì)上這是“浪費(fèi)”,而且在實(shí)施上這會(huì)帶來潛在的問題琼讽,對(duì)胖接口的修改將導(dǎo)致一連串的客戶端程序需要修改必峰,有時(shí)候這是一種災(zāi)難。在這種情況下钻蹬,將胖接口分解為多個(gè)特點(diǎn)的定制化方法吼蚁,使得客戶端僅僅依賴于它們的實(shí)際調(diào)用的方法,從而解除了客戶端不會(huì)依賴于它們不用的方法问欠。 分離的手段主要有以下兩種:1肝匆、委托分離,通過增加一個(gè)新的類型來委托客戶的請(qǐng)求顺献,隔離客戶和接口的直接依賴旗国,但是會(huì)增加系統(tǒng)的開銷。2注整、多重繼承分離能曾,通過接口多繼承來實(shí)現(xiàn)客戶的需求,這種方式是較好的肿轨。
以上就是5個(gè)基本的面向?qū)ο笤O(shè)計(jì)原則寿冕,它們就像面向?qū)ο蟪绦蛟O(shè)計(jì)中的金科玉律,遵守它們可以使我們的代碼更加鮮活椒袍,易于復(fù)用驼唱,易于拓展,靈活優(yōu)雅槐沼。不同的設(shè)計(jì)模式對(duì)應(yīng)不同的需求曙蒸,而設(shè)計(jì)原則則代表永恒的靈魂,需要在實(shí)踐中時(shí)時(shí)刻刻地遵守岗钩。就如ARTHUR J.RIEL在那邊《OOD啟示錄》中所說的:“你并不必嚴(yán)格遵守這些原則纽窟,違背它們也不會(huì)被處以宗教刑罰。但你應(yīng)當(dāng)把這些原則看做警鈴兼吓,若違背了其中的一條臂港,那么警鈴就會(huì)響起∈硬”