必須知道的設計模式

2021-04-12 23:26:14 字數 3198 閱讀 8685

• 設計模式(design & pattern)

物件導向、設計模式

引言 設計模式是物件導向思想的集大成,gof在其經典著作中總結了23種設計模式,又可分為:建立型、結構型和行為型3個大類。對於軟體設計者來說,一般的過程就是在熟練掌握語言背景的基礎上,了解類庫的大致框架和常用的函式和介面等,然後多再在百般錘煉中,提高對軟體設計思想的認識。

軟體設計者要清楚自己的定位和方向,一味的沉溺於技術細節的思路是制約個人技術走向成熟的毒藥。因此,學習軟體設計,了解軟體工程,是每個開發人員必備的一課。筆者在此不想詳細的描述各個設計模式的細節,我想google和baidu上的資料已經多如牛毛了。而且,爭取的學習方法也不是了解所有的設計模式就可以無敵於天下。我所強調的學習方法就是在熟練掌握基本要素的基礎上,了解大致的框架。這一條不僅是學習類庫的方法,對設計模式來說是可行的。同時,切記的是在平時的積累中,不斷的體會和實踐。因此,本文的目的就是將23種模式中,必須掌握的幾個最關鍵、最常用的設計模式,做以總結和簡述。

1 factory pattern

上榜理由:將程式中建立物件的操作,單獨出來處理,大大提高了系統擴充套件的柔性,介面的抽象化處理給相互依賴的物件建立提供了最好的抽象模式。

推薦熱貼:  .net設計模式(3):抽象工廠模式(abstract factory)

由淺入深學「工廠模式」(3)

switch語句,僵化的毒藥

2 facade pattern

上榜理由:將表現層和邏輯層隔離,封裝底層的複雜處理,為使用者提供簡單的介面,這樣的例子隨處可見。門面模式很多時候更是一種系統架構的設計,在我所做的專案中,就實現了門面模式的介面,為複雜系統的解耦提供了最好的解決方案。

推薦熱貼:設計模式學習筆記(十一)——facade外觀模式

設計模式解析之——facade模式(k_eckel**微軟高校部落格k_eckel's mindview)

3 command pattern

上榜理由:將請求封裝為物件,從而將命令的執行和責任分開。通常在佇列中等待命令,這和現實多麼的相似呀。如果你喜歡發號施令,請考慮你的icommond吧。

推薦熱貼:command模式應用實踐

.net設計模式(17):命令模式(command pattern)

4 strategy pattern

上榜理由:策略模式,將易於變化的部分封裝為介面,通常strategy 封裝一些運算法則,使之能互換。bruce zhang在他的部落格中提到策略模式其實是一種「面向介面」的程式設計方法,真是恰如其分。

推薦熱貼:.net中的設計模式——strategy模式

設計模式(22)-strategy pattern

5 iterator pattern

上榜理由:相信任何的系統中,都會用到陣列、集合、鍊錶、佇列這樣的型別吧,那麼你就不得不關心迭代模式的來龍去脈。在遍歷演算法中,迭代模式提供了遍歷的順序訪問容器,gof給出的定義為:提供一種方法訪問乙個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。.net中就是使用了迭代器來建立用於foreach的集合。

推薦熱貼:迭代器模式(iterator pattern)

net設計模式(18):迭代器模式(iterator pattern)

6 adapter pattern

上榜理由:在原型別不做任何改變的情況下,擴充套件了新的介面,靈活且多樣的適配一切舊俗。這種打破舊框框,適配新格局的思想,是物件導向的精髓。以繼承方式實現的類的adapter模式和以聚合方式實現的物件的adapter模式,各有千秋,各取所長。看來,把它叫做包裝器一點也不為過,

推薦熱貼:《讓僵冷的翅膀飛起來》系列之二——從例項談adapter模式

c#設計模式(10)-adapter pattern

.net設計模式(8):介面卡模式(adapter pattern)

7 observer pattern

上榜理由:定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時, 所有依賴於它的物件都得到通知並被自動更新。觀察者和被觀察者的分開,為模組劃分提供了清晰的界限。在.net中使用委託和事件可以更好的實現觀察者模式,事件的註冊和撤銷不就對應著觀察者對其物件的觀察嗎?

推薦熱貼:.net實用設計模式:觀察者模式(observer)

observer pattern in aop

.net設計模式(19):觀察者模式(observer pattern)

8 bridge pattern

上榜理由:把實現和邏輯分開,對於我們深刻理解物件導向的聚合復用的思想甚有助益。

推薦熱貼:.net設計模式(9):橋接模式(bridge pattern)

bridge strategy 和state的區別

設計模式(16)-bridge pattern

9 singleton pattern

上榜理由:改善全域性變數和命名空間的衝突,可以說是一種改良了的全域性變數。這種乙個類只有乙個例項,且提供乙個訪問全域性點的方式,更加靈活的保證了例項的建立和訪問約束。.net frameeork已經封裝了singleton類,我們拿來即可。

推薦熱貼:從c#的singleton設計模式

.net設計模式(2):單件模式(singleton pattern)

總結 仁者見仁。以上只是筆者一家之言,更重要的真知灼見皆**於實踐,設計思想和模式的應用也**於不斷的學習和反覆,我也將一如既往。此文只是開端,未來才是不斷的探索。

建議 1 不要拿著gof的書,從頭看到尾,對我來說那是聖經也是字典;

2 在軟體設計中體會設計模式,設計就是不斷的由需求生成的重構;

3 結合.net framework框架來學習設計模式在.net中的應用,對我們這樣的菜鳥來說是一舉兩得的事,即體味了設計,又深諳了框架;

4 把體會拿來共享。

致謝 感謝gof: erich gamma、richard helm、ralph johnson 和john vlissides,他們是經典;

感謝bruce zhang、terrylee、idior等的貢獻。他們是的榜樣。

參考文獻

james w. cooper,《c#設計模式》

劉藝,《delphi設計模式》

gof,《設計模式:可復用物件導向軟體的基礎》

必須知道的UML知識

如果你確定兩件物件之間是is a的關係,那麼此時你應該使用繼承 比如菱形 圓形和方形都是形狀的一種,那麼他們都應該從形狀類繼承而不是聚合。如果你確定兩件物件之間是has a的關係,那麼此時你應該使用聚合 比如電腦是由顯示器 cpu 硬碟等組成的,那麼你應該把顯示器 cpu 硬碟這些類聚合成電腦類,而...

關於 SqlParameter 必須知道的!

有時候寫 sqlparameter 對映 new sqlparameter recordid sqldbtype.bigint,0,recordid 有時候發現加不加 都可以,但是今天突然發現,如果不加 相當的能坑人!有些地方不加 是無法通過ado.net的檢查的,可能會報 指定的引數名 recor...

MySQL必須知道的點

mysql已經成為世界上最受歡迎的資料庫管理系統之一,無論是用在小型開發專案上,還是用在構建那較大型的 mysql都用實力證明了自己是乙個穩定 可靠 快速 可信的系統,足以勝任任何資料儲存業務的需要。使用過程中,這些點你都知道嗎?1.必須使用innodb儲存引擎 有更好的cpu和io效能,更好的備份...