設(shè)計(jì)模式常用的7大原則:
1、單一職責(zé)原則
2、接口隔離原則
3、依賴倒轉(zhuǎn)(倒置)原則
4、里氏替換原則
5、開(kāi)閉原則
6、迪米特法則
7、合成復(fù)用原則
設(shè)計(jì)模式是為了代碼或者軟件具有更好的1、重用性(相同功能的代碼不用重復(fù)編寫(xiě));2、可讀性(其他程序員可以理解);3、可擴(kuò)展性(增加新功能很方便);4、可靠性(新功能對(duì)原功能沒(méi)有影響);5、代碼出現(xiàn)高內(nèi)聚,低耦合的特性;
單一職責(zé)原則:
介紹:一個(gè)類應(yīng)該只負(fù)責(zé)一個(gè)職責(zé),如果A類負(fù)責(zé)兩個(gè)不同的職責(zé):職責(zé)1和職責(zé)2,那么當(dāng)職責(zé)1修改時(shí),職責(zé)2可能受到干擾,因此,應(yīng)該將A類粒度細(xì)分為A1和A2。
單一職責(zé)分為兩種:類單一職責(zé)和方法單一職責(zé)。
類單一職責(zé)例子:
方法單一職責(zé)例子:
單一職責(zé)原則注意事項(xiàng)和細(xì)節(jié):
1、降低了類的復(fù)雜度;
2、提高了類的可讀性,可維護(hù)性;
3、降低了變更引起的風(fēng)險(xiǎn);
4、通常情況下應(yīng)遵循單一職責(zé)原則,除非代碼邏輯足夠簡(jiǎn)單,才可以違反單一職責(zé)原則,只有類中方法足夠少,才可以違反方法單一職責(zé)原則;
接口隔離原則:
客戶端不應(yīng)該依賴它不需要的接口,即一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小接口之上。
為什么要用接口隔離原則?請(qǐng)看下面的例子:
依賴倒轉(zhuǎn)原則:
依賴倒轉(zhuǎn)原則是指:
1、高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴其抽象;
2、抽象不應(yīng)該依賴于細(xì)節(jié),應(yīng)該細(xì)節(jié)依賴于抽象;
3、依賴倒轉(zhuǎn)原則的中心思想是面向接口編程;
4、依賴倒轉(zhuǎn)原則基于這樣的設(shè)計(jì)理念:相對(duì)于多變的細(xì)節(jié),抽象則穩(wěn)定的多。以抽象為基礎(chǔ)搭建的架構(gòu),比以細(xì)節(jié)為基礎(chǔ)搭建的架構(gòu)要穩(wěn)定的多。在java中,抽象指的是接口或者抽象類。細(xì)節(jié)是指具體的實(shí)現(xiàn)類。
5、使用接口或者抽象類的目的是為了制定好規(guī)范,而不涉及具體的操作,把展現(xiàn)細(xì)節(jié)的任務(wù)交給實(shí)現(xiàn)類去完成。
依賴關(guān)系傳遞的三種方式和應(yīng)用案例:
1、接口傳遞
2、構(gòu)造方法傳遞
3、set方法傳遞。
里氏替換原則:
OO中的繼承性思考和說(shuō)明:
1)繼承包含了這一層含義:父類中已經(jīng)實(shí)現(xiàn)好了的方法,實(shí)際上是在設(shè)定規(guī)范和契約,雖然它不強(qiáng)制它的子類必須遵守這些契約,但是如果子類對(duì)這些已經(jīng)實(shí)現(xiàn)了的方法任意修改,則會(huì)對(duì)它的繼承性造成一定破壞。
2)繼承在給程序設(shè)計(jì)帶來(lái)便利的同時(shí),也帶來(lái)了一定的弊端,比如使用繼承會(huì)給程序帶來(lái)一定的侵入性。程序的可移植性降低,增加了對(duì)象之間的耦合性,如果一個(gè)類被其他的類繼承,則這個(gè)類修改的同時(shí)也得考慮其他子類。并且父類修改后,可能給子類帶來(lái)故障。
3)問(wèn)題提出:在編程中如何合理的使用繼承?==》里氏替換原則(子類繼承父類,最好不要重寫(xiě)父類方法)
基本介紹:
1、里氏替換原則(Lis Substitution Principle)在1988年,由麻省理工學(xué)院的以姓里的女士(這位女士還獲得了2008年的圖靈獎(jiǎng))提出的。
2、對(duì)每個(gè)類型為T(mén)1的對(duì)象o1,都有類型為T(mén)2的對(duì)象o2,使得T1定義的所有程序p在所有的對(duì)象o1都代換成o2時(shí),程序p的行為沒(méi)有發(fā)生任何變化,那么類型T2為類型T1的子類型。換句話說(shuō):所有引用基類的地方必須的透明的使用子類型。
3、在使用繼承時(shí),遵循里氏替換原則,在子類中最好不要重寫(xiě)父類的方法。
4、里氏替換原則原則告訴我們實(shí)際上兩個(gè)類的耦合性增強(qiáng)了,在適當(dāng)?shù)那闆r下可以通過(guò)聚合、組合、依賴來(lái)解決問(wèn)題。或者也可以將類中公共的方法提取出來(lái)成為一個(gè)公共接口,讓其他類也實(shí)現(xiàn)這個(gè)公共接口。
改進(jìn)方案:
開(kāi)閉原則:
1)開(kāi)閉原則(Open Closed Principle)是編程中最基礎(chǔ)、最重要的原則
2)一個(gè)軟件實(shí)體,如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)。
3)當(dāng)軟件需要變化時(shí),盡量通過(guò)擴(kuò)展軟件實(shí)體的行為來(lái)實(shí)現(xiàn)變化,而不是通過(guò)修改原來(lái)的代碼來(lái)實(shí)現(xiàn)變化。
4)編程中使用其他原則,以及使用設(shè)計(jì)模式的目的就是遵循開(kāi)閉原則。
下圖是非人類使用方法:
這種方法最大的問(wèn)題是如果添加類的修改代碼。
改進(jìn)方案:
這樣新增一個(gè)類就無(wú)需修改使用方代碼。
迪米特法則:
1)一個(gè)對(duì)象應(yīng)該對(duì)其他的對(duì)象保持最少的了解。
2)類與類關(guān)系越密切,耦合度越大。
3)迪米特法則(Demeter Principle)也叫最少知道原則,即一個(gè)類應(yīng)該對(duì)自己依賴的類知道的越少越好。
也就是說(shuō)對(duì)被依賴的類不管多復(fù)雜,都應(yīng)該將邏輯封裝在類的內(nèi)部,對(duì)外除了提供public的方法外,不對(duì)外泄露任何信息。
4)迪米特法則還有個(gè)更簡(jiǎn)單的定義:只與直接朋友通信。
5)直接朋友:每個(gè)對(duì)象都與其他對(duì)象有耦合關(guān)系,只要兩個(gè)對(duì)象之間有耦合關(guān)系,我們就說(shuō)對(duì)象之間是朋友關(guān)系。耦合的方式有很多,其中包括:關(guān)聯(lián)、泛化、實(shí)現(xiàn)、依賴、聚合、耦合(下一章節(jié)要講)等等。其中,我們稱出現(xiàn)在成員變量、方法參數(shù)、方法中的變量、方法返回值的類為直接朋友,而出現(xiàn)在局部變量中的類不是直接的朋友。也就是說(shuō)陌生的類最好還是不要以局部變量的方式出現(xiàn)在類的內(nèi)部。
迪米特法則的需要注意事項(xiàng)和細(xì)節(jié):
1)迪米特法則的核心思想時(shí)降低類和類之間的耦合
2)但要注意:由于每個(gè)類都減少不必要的依賴,因此迪米特法則只是要求降低類間(對(duì)象)間的耦合關(guān)系,并不是要求完全沒(méi)有依賴關(guān)系。
合成復(fù)用原則:
盡量使用合成/聚合的方式,少用繼承。
設(shè)計(jì)模式的核心思想:
1)找出應(yīng)用中可能變化之處,把他們獨(dú)立出來(lái),不要和那些不需要變化的代碼混在一起。
2)針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)細(xì)節(jié)編程。
3)為了實(shí)現(xiàn)交互對(duì)象之間的松耦合而努力。
UML圖:
1)uml--unified modeling language UML(統(tǒng)一建模語(yǔ)言)是一種用于軟件分析和設(shè)計(jì)的語(yǔ)言工具。它用于幫助軟件開(kāi)發(fā)人員進(jìn)行思考和記錄的結(jié)果。
2)uml本身是一套符號(hào)化的規(guī)定,就像數(shù)學(xué)符號(hào)和化學(xué)符號(hào)一樣,這些詞符號(hào)用于描述軟件模型中的各個(gè)元素和他們之間的關(guān)系,比如類、接口、實(shí)現(xiàn)、依賴、組合、聚合等。如下圖:
使用UML來(lái)建模,常用的工具有:Rational rose、億圖圖示(國(guó)產(chǎn)),idea插件有plaintUML,eclipse AmaterasUML。
畫(huà)UML圖
劃UML圖和寫(xiě)文章差不多,目的都是讓別人看,關(guān)鍵在于思路和條理清晰,UML分類:
1)用例圖(USER CASE)
2)靜態(tài)結(jié)構(gòu)圖:類圖、包圖、對(duì)象圖、組件圖、部署圖;
3)動(dòng)態(tài)行為圖:交互圖(時(shí)序圖和協(xié)作圖)、狀態(tài)圖、活動(dòng)圖;
說(shuō)明:
1)類圖是描述類和類之間的關(guān)系的,是UML圖最核心的。
2)在講解UML類圖設(shè)計(jì)模式時(shí),我們必然會(huì)使用到類圖,為了能夠讓學(xué)員把設(shè)計(jì)模式學(xué)要到位,需要先給大家講解類圖。
uml類圖:
1)類圖是用于描述系統(tǒng)中的類本身的組成和類對(duì)象之間的靜態(tài)關(guān)系。
2)類之間的關(guān)系:依賴、泛化、實(shí)現(xiàn)、關(guān)聯(lián)、組合和聚合。
類和類中的關(guān)系
依賴:
只要在類中使用到了對(duì)方,我們就說(shuō)他們之間存在存在依賴關(guān)系。如果沒(méi)有對(duì)方,可能連編譯都通過(guò)不了。
泛化:
泛化是依賴關(guān)系的特例。泛化就是繼承。
實(shí)現(xiàn):
實(shí)現(xiàn)是依賴關(guān)系的特例。A類實(shí)現(xiàn)了B接口或者抽象類,我們就說(shuō)A和B之間是實(shí)現(xiàn)關(guān)系。
關(guān)聯(lián):
關(guān)聯(lián)關(guān)系實(shí)際上是類與類之間的關(guān)聯(lián)關(guān)系,它是依賴關(guān)系的特例,具有導(dǎo)向性,即雙向關(guān)系和單向關(guān)系;
關(guān)聯(lián)關(guān)系具有多重性,如'1'(表示有且只有一個(gè)),'0......'(表示0個(gè)或多個(gè)),'0,1'(表示0個(gè)或1個(gè)),'n...m'(表示從n個(gè)到m個(gè)都可以),'m...'(表示至少m個(gè))
單向一對(duì)一關(guān)系:
雙向的1對(duì)1關(guān)系:
聚合:
聚合表示的是整體和部分的關(guān)系,整體和部分可以分開(kāi),聚合關(guān)系是關(guān)聯(lián)關(guān)系的特例。所以他們具有關(guān)聯(lián)關(guān)系的導(dǎo)航性和多重性。如一個(gè)學(xué)生有一個(gè)學(xué)號(hào)組成,學(xué)生和學(xué)號(hào)是可以分開(kāi)的。使用帶空菱形的實(shí)線來(lái)表示。
如果我們認(rèn)為學(xué)生和學(xué)號(hào)是分不開(kāi)的,則升級(jí)為組合關(guān)系。
組合:
組合也是表示的是整體和部分的關(guān)系,整體和部分不可以分開(kāi),組合關(guān)系也是關(guān)聯(lián)關(guān)系的特例。所以他們具有關(guān)聯(lián)關(guān)系的導(dǎo)航性和多重性。如一個(gè)人Persion有一個(gè)頭部Head組成,人和頭部是不可以分開(kāi)的。使用黑色菱形的實(shí)線來(lái)表示。
設(shè)計(jì)模式三大類:
設(shè)計(jì)模式分為3大類,共23種
1)創(chuàng)建型模式:?jiǎn)卫J?、工廠模式、抽象工廠模式、原型模式、建造者模式;
2)結(jié)構(gòu)型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式;
3)行為模式:模板方法模式、命令模式、訪問(wèn)者模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態(tài)模式、策略模式、責(zé)任鏈模式(職責(zé)鏈模式);
聯(lián)系客服