設計模式常用的7大原則:

1、單一職責原則

2、接口隔離原則

3、依賴倒轉(倒置)原則

4、里氏替換原則

5、開閉原則

6、迪米特法則

7、合成複用原則

設計模式是爲了代碼或者軟件具有更好的1、重用性(相同功能的代碼不用重複編寫);2、可讀性(其他程序員可以理解);3、可擴展性(增加新功能很方便);4、可靠性(新功能對原功能沒有影響);5、代碼出現高內聚,低耦合的特性;

單一職責原則:

介紹:一個類應該只負責一個職責,如果A類負責兩個不同的職責:職責1和職責2,那麼當職責1修改時,職責2可能受到干擾,因此,應該將A類粒度細分爲A1和A2。

單一職責分爲兩種:類單一職責和方法單一職責。

類單一職責例子:

文章圖片1

文章圖片2

方法單一職責例子:

文章圖片3

單一職責原則注意事項和細節:

1、降低了類的複雜度;

2、提高了類的可讀性,可維護性;

3、降低了變更引起的風險;

4、通常情況下應遵循單一職責原則,除非代碼邏輯足夠簡單,纔可以違反單一職責原則,只有類中方法足夠少,纔可以違反方法單一職責原則;

接口隔離原則:

客戶端不應該依賴它不需要的接口,即一個類對另一個類的依賴應該建立在最小接口之上。

爲什麼要用接口隔離原則?請看下面的例子:

文章圖片4

依賴倒轉原則:

依賴倒轉原則是指:

1、高層模塊不應該依賴於低層模塊,二者都應該依賴其抽象;

2、抽象不應該依賴於細節,應該細節依賴於抽象;

3、依賴倒轉原則的中心思想是面向接口編程;

4、依賴倒轉原則基於這樣的設計理念:相對於多變的細節,抽象則穩定的多。以抽象爲基礎搭建的架構,比以細節爲基礎搭建的架構要穩定的多。在java中,抽象指的是接口或者抽象類。細節是指具體的實現類。

5、使用接口或者抽象類的目的是爲了制定好規範,而不涉及具體的操作,把展現細節的任務交給實現類去完成。

依賴關係傳遞的三種方式和應用案例:

1、接口傳遞

2、構造方法傳遞

3、set方法傳遞。

里氏替換原則:

OO中的繼承性思考和說明:

1)繼承包含了這一層含義:父類中已經實現好了的方法,實際上是在設定規範和契約,雖然它不強制它的子類必須遵守這些契約,但是如果子類對這些已經實現了的方法任意修改,則會對它的繼承性造成一定破壞。

2)繼承在給程序設計帶來便利的同時,也帶來了一定的弊端,比如使用繼承會給程序帶來一定的侵入性。程序的可移植性降低,增加了對象之間的耦合性,如果一個類被其他的類繼承,則這個類修改的同時也得考慮其他子類。並且父類修改後,可能給子類帶來故障。

3)問題提出:在編程中如何合理的使用繼承?==》里氏替換原則(子類繼承父類,最好不要重寫父類方法)

基本介紹:

1、里氏替換原則(Lis Substitution Principle)在1988年,由麻省理工學院的以姓裏的女士(這位女士還獲得了2008年的圖靈獎)提出的。

2、對每個類型爲T1的對象o1,都有類型爲T2的對象o2,使得T1定義的所有程序p在所有的對象o1都代換成o2時,程序p的行爲沒有發生任何變化,那麼類型T2爲類型T1的子類型。換句話說:所有引用基類的地方必須的透明的使用子類型。

3、在使用繼承時,遵循里氏替換原則,在子類中最好不要重寫父類的方法。

4、里氏替換原則原則告訴我們實際上兩個類的耦合性增強了,在適當的情況下可以通過聚合、組合、依賴來解決問題。或者也可以將類中公共的方法提取出來成爲一個公共接口,讓其他類也實現這個公共接口。

改進方案:

文章圖片5

開閉原則:

1)開閉原則(Open Closed Principle)是編程中最基礎、最重要的原則

2)一個軟件實體,如類、模塊和函數應該對擴展開放,對修改關閉。用抽象構建框架,用實現擴展細節。

3)當軟件需要變化時,儘量通過擴展軟件實體的行爲來實現變化,而不是通過修改原來的代碼來實現變化。

4)編程中使用其他原則,以及使用設計模式的目的就是遵循開閉原則。

下圖是非人類使用方法:

文章圖片6

這種方法最大的問題是如果添加類的修改代碼。

改進方案:

文章圖片7

這樣新增一個類就無需修改使用方代碼。

迪米特法則:

1)一個對象應該對其他的對象保持最少的瞭解。

2)類與類關係越密切,耦合度越大。

3)迪米特法則(Demeter Principle)也叫最少知道原則,即一個類應該對自己依賴的類知道的越少越好。

也就是說對被依賴的類不管多複雜,都應該將邏輯封裝在類的內部,對外除了提供public的方法外,不對外泄露任何信息。

4)迪米特法則還有個更簡單的定義:只與直接朋友通信。

5)直接朋友:每個對象都與其他對象有耦合關係,只要兩個對象之間有耦合關係,我們就說對象之間是朋友關係。耦合的方式有很多,其中包括:關聯、泛化、實現、依賴、聚合、耦合(下一章節要講)等等。其中,我們稱出現在成員變量、方法參數、方法中的變量、方法返回值的類爲直接朋友,而出現在局部變量中的類不是直接的朋友。也就是說陌生的類最好還是不要以局部變量的方式出現在類的內部。

迪米特法則的需要注意事項和細節:

1)迪米特法則的核心思想時降低類和類之間的耦合

2)但要注意:由於每個類都減少不必要的依賴,因此迪米特法則只是要求降低類間(對象)間的耦合關係,並不是要求完全沒有依賴關係。

合成複用原則:

儘量使用合成/聚合的方式,少用繼承。

設計模式的核心思想:

1)找出應用中可能變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。

2)針對接口編程,而不是針對實現細節編程。

3)爲了實現交互對象之間的松耦合而努力。

UML圖:

1)uml--unified modeling language UML(統一建模語言)是一種用於軟件分析和設計的語言工具。它用於幫助軟件開發人員進行思考和記錄的結果。

2)uml本身是一套符號化的規定,就像數學符號和化學符號一樣,這些詞符號用於描述軟件模型中的各個元素和他們之間的關係,比如類、接口、實現、依賴、組合、聚合等。如下圖:

文章圖片8

使用UML來建模,常用的工具有:Rational rose、億圖圖示(國產),idea插件有plaintUML,eclipse AmaterasUML。

畫UML圖

劃UML圖和寫文章差不多,目的都是讓別人看,關鍵在於思路和條理清晰,UML分類:

1)用例圖(USER CASE)

2)靜態結構圖:類圖、包圖、對象圖、組件圖、部署圖;

3)動態行爲圖:交互圖(時序圖和協作圖)、狀態圖、活動圖;

說明:

1)類圖是描述類和類之間的關係的,是UML圖最核心的。

2)在講解UML類圖設計模式時,我們必然會使用到類圖,爲了能夠讓學員把設計模式學要到位,需要先給大家講解類圖。

uml類圖:

1)類圖是用於描述系統中的類本身的組成和類對象之間的靜態關係。

2)類之間的關係:依賴、泛化、實現、關聯、組合和聚合。

類和類中的關係

依賴:

只要在類中使用到了對方,我們就說他們之間存在存在依賴關係。如果沒有對方,可能連編譯都通過不了。

泛化:

泛化是依賴關係的特例。泛化就是繼承。

實現:

實現是依賴關係的特例。A類實現了B接口或者抽象類,我們就說A和B之間是實現關係。

關聯:

關聯關係實際上是類與類之間的關聯關係,它是依賴關係的特例,具有導向性,即雙向關係和單向關係;

關聯關係具有多重性,如'1'(表示有且只有一個),'0......'(表示0個或多個),'0,1'(表示0個或1個),'n...m'(表示從n個到m個都可以),'m...'(表示至少m個)

單向一對一關係:

文章圖片9

文章圖片10

雙向的1對1關係:

文章圖片11

文章圖片12

文章圖片13

聚合:

聚合表示的是整體和部分的關係,整體和部分可以分開,聚合關係是關聯關係的特例。所以他們具有關聯關係的導航性和多重性。如一個學生有一個學號組成,學生和學號是可以分開的。使用帶空菱形的實線來表示。

文章圖片14

文章圖片15

如果我們認爲學生和學號是分不開的,則升級爲組合關係。

文章圖片16

組合:

組合也是表示的是整體和部分的關係,整體和部分不可以分開,組合關係也是關聯關係的特例。所以他們具有關聯關係的導航性和多重性。如一個人Persion有一個頭部Head組成,人和頭部是不可以分開的。使用黑色菱形的實線來表示。

文章圖片17

設計模式三大類:

設計模式分爲3大類,共23種

1)創建型模式:單例模式、工廠模式、抽象工廠模式、原型模式、建造者模式;

2)結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式;

3)行爲模式:模板方法模式、命令模式、訪問者模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、責任鏈模式(職責鏈模式);

相關文章