設計模式 總結篇

2021-06-21 10:58:43 字數 2525 閱讀 7830

《大話設計模式》終於到了總結這一天,這本書主要講述了23個設計模式和六大原則。而六大原則卻是這23個設計模式的核心。每個模式都遵從一種或幾種原則,所以在此針對六大原則進行了相關總結。

單一職責原則

定義:導致類變更的原因,應該僅有乙個。通俗的說,即乙個類只負責一項職責。

說到單一職責原則,很多大鳥都會不屑一顧。因為它太簡單了,稍有經驗的程式設計師即使從來沒有讀過設計模式、從來沒有聽說過單一職責原則,在設計軟體時也會自覺的遵守這一重要原則,因為在軟體程式設計中,誰也不希望因為修改了乙個功能導致其他的功能發生故障。而避免出現這一問題的方法便是遵循單一職責原則。

但這也僅僅是對大鳥而言,對於我們這些初入程式設計的菜鳥來說依舊需要細心學習。還記得作品展時期,剛剛動手做的時候都會建立乙個form1 這樣的窗體,於是乎各種各樣的**像api函式呀,各種引用呀,實現各種功能的

function

等等都放在了

from

1中,看著自己寫了這麼多**心裡還美滋滋的,但是當出現錯誤或者需要改動的時候就傻眼了。這樣不僅維護麻煩,缺乏靈活性,更別提復用了。所以說單一職責原則是真重要。 優點

: 依賴倒置原則

定義:高層模組不應該依賴低層模組,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。就是要針對介面程式設計,不要對實現程式設計。

我們常用之物電腦的cpu,記憶體條,硬碟等都是在針對介面設計的,每個都有規定的介面,當某個部件損壞時只需要更換新的即可,而如果cpu,記憶體條等部件是依賴於具體主機板的話,當主機板壞了或者更換其它型號時,其他的部件也就都作廢了。

所以說無論是高層模組(主機板)還是底層模組(cpu)都應該依賴於抽象即介面或抽象類。

因為相對於細節的多變性,抽象的東西要穩定的多。

黎克特制代換原則

先不說內容,剛看到這個原則名字的時候腦子裡就充滿了疑惑,為什麼叫這麼個奇怪的名字?

其實原因就是這項原則最早是在2023年,由麻省理工學院的一位姓裡的女士(barbara liskov)提出來的。所以就按其姓氏命名了。

定義:子型別必須能夠替換掉它們的父型別;也就是乙個軟體實體如果使用的是乙個父類的話,那麼一定適用於其子類,而且它覺察不出父類物件和子類物件的區別。也就是說在軟體裡邊,把父類都替換成它的子類,程式的行為沒有變化。

正是因為這個原則才使得繼承復用成為了可能,只有當子類可以替換掉父類,軟體單位的功能不受影響時,父類才能真正被復用,而子類也能夠在父類基礎上增加新的行為。比如:cat繼承

animal

類,以動物的身份擁有吃,喝,跑等行為,可當我們需要dog,pig也繼承

animal

類時,是需要更改例項化的地方即可,其他地方不用改動。

合成聚合復用原則

定義:盡量使用合成/聚合,盡量不使用類繼承。合成聚合是「hasa」的關係,而繼承是「isa」的關係。

上面剛剛講了繼承,覺得繼承真是方便又強大,但仔細分析下,繼承的雙方父類和子類的關係,他們是緊密依賴的,父類變,子類必變。所以繼承是一中強耦合的結構限制了系統的靈活性,所以我們要慎用繼承,不是「isa」關係,我們一般不要用繼承。優先使用合成聚合復用原則,有助於保持每個類的封裝,降低繼承的層次。

迪公尺特法則

定義:如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中乙個類需要,呼叫另乙個類的某乙個方法時,可以通過第三者**這個呼叫。

類與類之間的關係越密切,耦合度越大,當乙個類發生改變時,對另乙個類的影響也越大。如何避免這種情況呢?那就是盡量降低類與類之間的耦合,這也正是迪公尺特法則的目標。

開閉原則

定義:乙個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。

現在來說說最後乙個原則—開閉原則,之所以把它放在最後來說,不是因為它不夠重要,相反他是最重要的乙個。

開閉原則是物件導向設計中最基礎的設計原則,它指導我們如何建立穩定靈活易擴充套件的系統,這也正是所有設計模式的最終目的。其實,我們遵循設計模式前面5大原則,以及使用23種設計模式的目的就是遵循開閉原則。也就是說,只要我們對前面5項原則遵守的好了,設計出的軟體自然是符合開閉原則的,這個開閉原則更像是前面五項原則遵守程度的「平均得分」,前面5項原則遵守的好,平均分自然就高,說明軟體設計開閉原則遵守的好;如果前面5項原則遵守的不好,則說明開閉原則遵守的不好。

作者把學習設計模式的學習分為了四個境界 1

.沒學前是一點不懂,根本想不到用設計模式,設計的**很糟糕。 2

.學了幾個模式後,很開心,於是到處想著要用自己學過的模式,於是時常造成誤用模式而不自知。 3

.學完全部模式時,感覺諸多模式極其相似,無法分清模式之間的差異,有困惑,但深知誤用之害,應用之時有所猶豫。 4

.靈活應用模式,甚至不應用具體的某種模式也能設計出非常優秀的代價,以達到無劍勝有劍的境界。

顯然,我們現在正處於第三境界,困惑各種模式之間的差別。但是也沒必要糾結,學習不是一蹴而就的事,馬上就要開機房收費系統重構版了,這正好是個亮劍練手的機會。

不忘初心方得始終:學習設計模式的目的就是設計出易維護,易擴充套件,易復用,靈活性好的程式。

向著這個方向努力!

設計模式總結篇

一 建立型模式 singleon模式 解決的是實體物件個數的問題。除了singleton之外,其它建立型模式解決的都是new所帶來的耦合關係。factory method absract factory builder都需要乙個額外的工廠類來負責例項化 易變物件 而protorty則是通過原型 乙個...

設計模式學習筆記(總結篇 模式分類)

gof根據模式的目標將模式分為三個類目 建立型 行為型和結構型。建立型模式設計物件的例項化,這類模式的特點是,不讓使用者依賴於物件的建立或排列方式,避免使用者直接使用new運算子建立物件。gof的 23中模式中的下列 5種模式屬於建立型模式 1 工廠方法模式 定義乙個用於建立物件的介面,讓子類決定例...

C語言和設計模式(總結篇)

設計模式的書相信很多人都看過。對於設計模式這樣一種方法,相信不同的人有不同的理解。我在這裡寫的部落格只是我個人對設計模式的粗淺認識。文中肯定存在很多的不足和不成熟之處,希望朋友們諒解。望大家多多指正,謝謝!01 c語言和設計模式 繼承 封裝 多型 02 c語言和設計模式 訪問者模式 03 c語言和設...