引入設(shè)計(jì)模式的目的:增強(qiáng)系統(tǒng)的可維護(hù)性。
設(shè)計(jì)模式一般不能提高軟件的功能和性能。
設(shè)計(jì)模式(Design Patterns):從建筑領(lǐng)域而來(lái),是對(duì)軟件設(shè)計(jì)中普遍存在而又反復(fù)出現(xiàn)的各種問題,所提出的解決方案。
設(shè)計(jì)模式并不直接用來(lái)完成程序代碼的編寫,而是描述在各種不同的情況下,要如何解決問題的一種方案。
四人組針對(duì)創(chuàng)建優(yōu)秀的面向?qū)ο笤O(shè)計(jì)提出的建議:
1、針對(duì)接口進(jìn)行設(shè)計(jì);
2、優(yōu)先使用對(duì)象組合,而不是類繼承;
3、找到并封裝變化點(diǎn)。
設(shè)計(jì)模式可以讓我們:
1、復(fù)用解決方案。利用已有的模式開發(fā),可以借鑒他人的經(jīng)驗(yàn),減少開發(fā)成本和風(fēng)險(xiǎn)。
2、建立通用術(shù)語(yǔ)。在項(xiàng)目的分析和設(shè)計(jì)階段,模式提供了約定俗成的詞匯和視角,有利于溝通。
3、解放視角。無(wú)論針對(duì)問題還是設(shè)計(jì),設(shè)計(jì)模式提供了高層次的視角,開發(fā)人員不必一開始就埋頭于具體的細(xì)節(jié)之中。
面相對(duì)象:
可維護(hù) 改
可復(fù)用 替換下來(lái)的字仍然有用
可擴(kuò)展 可加字
靈活性好 可豎排
通過(guò)封裝、繼承、多態(tài)把程序的耦合度降低。
用設(shè)計(jì)模式使得程序更加靈活,容易修改,并且易于復(fù)用。
編程原則之一:盡可能避免重復(fù)。
UML中的集中關(guān)系:
依賴關(guān)系(Dependency):
類方法的形參或返回值為其他類的對(duì)象。
如,新陳代謝(in o2:氧氣,in water:水)。
虛線箭頭
關(guān)聯(lián)關(guān)系(Association):
一個(gè)類“知道”另一個(gè)類。
如,penguin知道climate。
實(shí)線箭頭
聚合關(guān)系(Aggregation):
表示一種弱的“擁有”關(guān)系,體現(xiàn)的是A對(duì)象可以包含B對(duì)象,但B對(duì)象不是A對(duì)象的一部分。
如,雁群擁有大雁。
空心菱形 +實(shí)線箭頭
合成關(guān)系(Composition):
是一種強(qiáng)的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系,部分和整體的生命周期一致。
如,大雁擁有翅膀。
實(shí)心菱形 +實(shí)線箭頭
設(shè)計(jì)模式遵循的幾個(gè)原則:單一職責(zé)原則:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。
如果能夠想到多于一個(gè)的動(dòng)機(jī)去改變一個(gè)類,那么這個(gè)類就具有多于一個(gè)的職責(zé)。
軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并把那些職責(zé)相互分離。
開放封閉原則:
軟件實(shí)體(類、模塊、函數(shù)等等)可以擴(kuò)展,但是不可修改
對(duì)于擴(kuò)展開放(open for extension)
對(duì)于更改封閉(closed for modification)
怎樣的設(shè)計(jì)才能面對(duì)需求的改變卻可以保持相對(duì)穩(wěn)定,從而使得系統(tǒng)可以在第一個(gè)版本以后不斷推出新的版本呢?
無(wú)論模塊多么的“封閉”,都會(huì)存在一些無(wú)法對(duì)之封閉的變化。
既然不可能完全封閉,設(shè)計(jì)人員必須對(duì)于他設(shè)計(jì)的模塊應(yīng)該對(duì)那種變化封閉做出選擇。
他必須先猜測(cè)出最有可能發(fā)生的變化種類,然后構(gòu)造抽象來(lái)隔離那些變化。
等到變化發(fā)生時(shí)立即采取行動(dòng)。
在最初編寫代碼時(shí),假設(shè)變化不會(huì)發(fā)生。當(dāng)變化發(fā)生時(shí),就創(chuàng)建抽象來(lái)隔離以后發(fā)生的同類變化。
面對(duì)需求,對(duì)程序的改動(dòng)是通過(guò)增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。
希望的是在開發(fā)工作展開不久就知道可能發(fā)生的變化。
查明可能發(fā)生的變化所等待的時(shí)間越長(zhǎng),要?jiǎng)?chuàng)建的抽象就越困難。
開放封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在。
遵循這個(gè)原則可以帶來(lái)面向?qū)ο蠹夹g(shù)所聲稱的巨大好處,也就是可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性好。
開發(fā)人員應(yīng)該僅對(duì)程序中呈現(xiàn)出頻繁變化的那些部分做出抽象。
然而,對(duì)于應(yīng)用程序的每個(gè)部分都刻意地進(jìn)行抽象同樣不是一個(gè)好主意。
拒絕不成熟的抽象和抽象本身一樣重要。
里氏代換原則:
子類型必須能夠替換掉它們的父類型。
即一個(gè)軟件實(shí)體如果使用的是一個(gè)父類的話,那么一定適用于其子類,而且它覺察不出父類對(duì)象和子類對(duì)象的區(qū)別。也就是說(shuō),在軟件里面,把父類都替換成它的子類,程序行為沒有變化。
只有當(dāng)子類可以替換掉父類,軟件單位的功能不受到影響時(shí),父類才能真正被復(fù)用,而子類也能夠在父類的基礎(chǔ)上增加新的行為。
正是由于子類型的可替換性才使得使用父類類型的模塊在無(wú)需修改的情況下就可以擴(kuò)展。
依賴倒轉(zhuǎn)原則:
A 高層模塊不應(yīng)該依賴底層模塊。兩個(gè)都應(yīng)該依賴抽象。
B 抽象不應(yīng)該依賴細(xì)節(jié)。細(xì)節(jié)應(yīng)該依賴抽象。
針對(duì)接口編程,不要對(duì)實(shí)現(xiàn)編程。
依賴倒轉(zhuǎn)其實(shí)可以說(shuō)是面向?qū)ο笤O(shè)計(jì)的標(biāo)志,用那種語(yǔ)言來(lái)編寫程序不重要,如果編寫時(shí)考慮的都是如何針對(duì)抽象編程而不是針對(duì)細(xì)節(jié)編程,即程序中所有的依賴關(guān)系都是終止于抽象類或者接口,那就是面向?qū)ο蟮脑O(shè)計(jì),反之那就是過(guò)程化設(shè)計(jì)了。
迪米特法則:
最少知識(shí)原則:
如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用。
如果其中一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
迪米特法則首先強(qiáng)調(diào)的前提是:在類的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng)盡量降低成員的訪問權(quán)限。
迪米特法則其根本思想,是強(qiáng)調(diào)了類之間的松耦合。
類之間的耦合越弱,越有利于復(fù)用,一個(gè)處在弱耦合的類被修改,不會(huì)對(duì)有關(guān)系的類造成波及。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注