哪些設計模式最值得學習

2021-05-21 22:39:28 字數 2498 閱讀 9838

《設計模式》已經出版超過15年了,到今天已經不是什麼新鮮的東西了,可以說正在由「絕招」慢慢向著「基本功」轉變著。然而,這種學習模式的方式方法卻實在令人擔憂。

abstract factory在實際中並不常見,因為它需要你有兩套並行的繼承體系,需要對同乙個抽象有多於一種的實現方式。這種複雜的系統可以說不是每個領域,每個開發人員都能遇到的。在某些特定的領域可能很常見,但是在大多數領域並不需要這麼複雜的物件建立方法。這就造成了很多人「殺雞用宰牛刀」,用複雜的方式,解決不那麼複雜的問題。後果是增加了不必要的複雜度,給系統維護增加了困難。

另乙個模式singleton,由於實現簡單,意圖「似乎」也很明顯。被很多人用來作為「優化」的一種方式。通過這種方式來節省記憶體空間,減少物件例項。但是單一例項本身就等同於全域性變數,而全域性變數在幾十年前就已經被證明是「反模式」了,用另一種形態的全域性變數來代替另一種形態的全域性變數有什麼好處麼?問題在與,singleton的「意圖」並不在於優化,而是在於「妥協」。singleton的目的在於保證物件有單一的例項,這是因為物件必須要有單一的例項,如果存在多個例項,可能會引發錯誤。也就是說,singleton以犧牲程式的清晰和可維護性,來達到保證程式正確的目的。這跟本就和優化八竿子打不著,這完全是一種設計上的妥協,犧牲一些好處來獲取更大的好處。如果僅僅是為了節省幾個物件例項,而非程式的正確才使用singleton,那就是丟了西瓜揀芝麻。況且節省那幾個例項也跟本就不可能對程式的效能有太大的影響(特殊領域除外)。

人的時間是有限的,23個模式也不是都那麼常用,哪些模式才是最經常用到的,才是最值得學習的呢?

第一梯隊:iterator,observer,template method,strategy

iterator:linq,foreach這不都是iterator麼。

observer:mvc的核心,.net中事件就是observer。

strategy:對同乙個行為有不同實現的時候,如果考慮將行為的實現委託(不是.net中的委託)給另乙個類,那就用到了strategy。通過這種方式,可以簡單的替換演算法的實現類,來達到更換演算法的目的。

class

foopublic

void

dosomething()

}class

a : ibar

}class

b : ibar}

template method:乙個演算法的同乙個步驟有不同的實現,通過繼承來實現。這種方式通過建立子類來改變演算法的實現和行為。asp.net webform中page的oninit,onload等事件,就是template method

class

fooprotected

abstract

void

dowhatyouwant();

}class

a: foo

}class

b: foo}

物件導向的乙個重要特點就是多型,也就是對於同乙個動作有不同的行為。strategry通過委託的方式,將乙個演算法的不同實現委託給其它類;template method通過繼承的方式,讓子類實現演算法的可變部分,基類則處理演算法的流程和不變部分。近年來組合優於繼承的觀點已經成為主流,因此strategy的處境頻率相對高一些,但是template method在解決簡單問題的時候更好用,只要注意繼承層次不要太多(<=3)就好。

第二梯隊:adapter,facade,decorator

adapter:當你需要使用第三方庫,但是又不想太依賴於它的api,以便於今後在需要時可以方便的切換到另乙個庫的時候,你就需要在你的**和第三方api之間放置乙個抽象層,也就需要用adapter模式了。比如你想使用log4net,如果直接在**中到處引用log4net的api,將來有一天需要切換到另乙個庫比如entlib,你的改動量可就大了去了。如果在一開始就自己設計乙個api,在**中使用自己的api,再用adapter模式將log4net的api包裝到自己的api中,如果有一天想要切換到entlib,只要為entlib在寫乙個adapter就行了。對於ioc框架也是一樣的。不過需要注意的是,如果第三方庫的api介面非常龐大,使用adapter就會很麻煩,因為你需要包裝太多的東西,那麼使用adapter可能就不是乙個太好的主意。或許謹慎考慮確定乙個不太可能會變化的第三方庫更好一些。

facade:基本上用於簡化api,隱藏細節,在乙個系統中,高層模組呼叫低層模組時,如果低層模組api比較複雜,而高層模組並不需要這種複雜度,那麼加乙個facade,可以簡化高層模組使用api的難度。

decorator:為乙個類的行為增加行為,比如asp.net mvc中的action filter。

第三梯隊:command,state,composite

command:統一介面,undo/redo。

composite:asp.net webform的page和control就是乙個例子。

這些模式和分類只是憑我的感覺,並沒有任何實際的資料做支援,而我的感覺也只**於我所接觸到的領域和**。 希望同學們也可以提供自己接觸到的**中,最常見到和用到的模式。

哪些設計模式最值得學習

最近又在首頁看到幾篇設計模式相關的學習隨筆。回想起來,這幾年在園子裡發布的有關設計模式的隨筆都有乙個共同的特點。那就是factory和singleton居多,如果是系列的,也往往是從這兩個模式開始的。由於能夠堅持把 設計模式 中所有模式都寫完的非常少,所以基本上也很少見到有關其它模式的隨筆。這種情況...

2023年哪些網頁設計流行趨勢最值得關注的?

在過去的2013年,網頁設計領域又有了新變化,有的設計理念正在逐漸淡去,有的發展趨勢依然強勁,還有的則是小荷才露尖尖角。這篇文章中,我想介紹一些我們已經看到正不斷發展中的網頁設計流行趨勢,這些設計理念在2014年將會被應用得更普遍。現在,讓我們來一起盤點一下吧。扁平的設計是2013年出現的最大的趨勢...

2023年哪些網頁設計流行趨勢最值得關注的?

在過去的2013年,網頁設計領域又有了新變化,有的設計理念正在逐漸淡去,有的發展趨勢依然強勁,還有的則是小荷才露尖尖角。這篇文章中,我想介紹一些我們已經看到正不斷發展中的網頁設計流行趨勢,這些設計理念在2014年將會被應用得更普遍。現在,讓我們來一起盤點一下吧。扁平的設計是2013年出現的最大的趨勢...