從壹開始 [ Design Pattern ] 之一 ║ 設計模式開篇講


緣起

 

不說其他的沒用的開場白了,直接給大家分享三個小故事,都來自於我的讀者粉絲(我厚着臉皮稱為粉絲吧 😂):

問題一:半年前開始學 netcore,現在學東西還是有些吃力,老是報錯,比如Autofac,而且還老是找不到解決辦法,找到了吧,可能下次還是出錯,學習也是斷斷續續的,但是公司還是用 .net ,心累

問題二:說自己跟着我的文章還有項目,學了 NetCore 也有一段時間了,基本都能看懂,但是學到了 DDD 以后,自己動手搭建,發現一直品不出來味道,仿佛又回到了當時用動軟代碼生成器生成三層代碼的時代了,心慌

問題三:現在啥基本都會點兒,但是不是很懂原理,比如 Autofac 現在我基本都能改 bug,但是它是如何攔截代理服務的?感覺不踏實,要不要繼續往下學,看着很多人說微服務啊,Devops啊,感覺很牛的樣子,自己不會,感覺像小白,心迷茫

 

我也或多或少的有過這樣的心理,我也相信,大家可能也偶爾會有這樣的想法,雖然這三個問題看起來可能不一樣,也可能里邊有很多其他的原因,但是總結來說,可能有一個共同特性,那就是對原理和設計思路的不理解,只會用不會設計,或者說,知其然不知其所以然,因此可能改了還會出錯,或者會改了但是沒有成就感,然后通過用“看起來”更炫酷的技術武裝自己。

當然新技術有時間還是要學,但是思想層面的東西,無論是對程序員代碼技能,還是對思想層面的建設,都很有幫助,我認識兩個微軟的大佬,沒有那么浮誇的技術,但是數據結構,算法,和快速設計框架的邏輯,讓我望塵莫及,就算是不懂一個技術,但是能猜出來大概怎么用,因為已經深諳其法了,因此我決定開始開一個設計系列,簡單的聊聊設計模式(23種)和開發原則(6個大類),當然很多人都講過,但是我想再說一遍,可能印象更深刻,而且我和別人講的可能不一樣,而且也是用 NetCore 3.0 做的 Demo。

 

 

一、目錄

1、源代碼Github

每篇文章呢,我會每個設計模式建立一個單獨 solution,然后放到一個公共 GitHub 倉庫里,

目前,還沒有內容,我會跟隨文章更新,但是這個總的倉庫地址不會變:

Github: https://github.com/anjoy8/DesignPattern

 

 

2、本系列文章一覽

文章更新中......

 

 

 

二、設計模式的重要性

相信這個重要性我就不用多說了,每個人都知道它的重要性,它是從我們剛開始接觸代碼就聽到的,正式參加工作的時候用到的,以及當上架構師或者項目主管后講到的,如果要是還有設計模式沒有用,或者不想學,那這一系列文章,可以不用看了,真的。

 

下邊這些是我從網上隨便摘抄的,隨便的意思,是說很重要,大家都在說,我這里象征性的意義列一下:

1.設計模式是解決方案

2.設計模式是特定問題的解決方案

3.設計模式是重復出現的、特定問題的解決方案

4.設計模式是用於解決在特定環境下、重復出現的、特定問題的解決方案

5.設計模式是經過驗證的,用於解決在特定環境下、重復出現的、特定問題的解決方案



作者:_伽藍寺聽雨聲

 

然后這里有意義:

自從程序誕生之初,就面臨着來自 耦合性,內聚性以及可維護性,可擴展性,重用性,靈活性 等多方面的挑戰。

而面向對象是為了解決系統的可維護性,可擴展性,可重用性等以上問題而出現的。

設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類的、代碼設計經驗的總結

為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。

設計模式包含了面向對象的精髓,有種說法是“懂了設計模式,你就懂了面向對象分析和設計(OOA/D)的精要”。

 


作者:「LeafBoatSailor」

 

最后這里還有心得:

設計模式,我認為是前輩程序員在大量開發中累積的經驗,然后歸納為了這些設計模式,理所當然的,這23個設計模式絕不是代表了所有的開發真理,在問題面前應該靈活變通,當你的代碼類結構合理, 易於維護 ,可擴展性強,那么是否使用了這23個設計模式已經無所謂了,因為這些前輩留下來的經驗就是為了當你的項目做的非常大,非常復雜的時候,仍然能讓你能掌控這些代碼,不會讓他們亂成一團。這才是設計模式真正的意義吧。


作者:「曉_晨」

 

那下邊我們就說說,這個系列講哪些內容。

 

三、講解白皮書

 

設計模式有兩個大塊,一個是原則,一個是設計方案,我們基於某個,或者某幾個原則,來規范我們的模式,然后通過模式,來規范我們的項目代碼。

1、11 種設計原則

 

看不懂沒關系,之后會稍微的說到,其實很多咱們也都知道了,比如依賴倒置、開放封閉、里氏替換、無環依賴、穩定抽象等等,我們平時都在使用:

 (11 種設計原則)

 

 

2、23 種設計模式

 

 (23種設計模式關系圖)

 

 

創建型模式:

  1. 單例(Singleton)模式:某個類只能生成一個實例,該類提供了一個全局訪問點供外部獲取該實例,其拓展是有限多例模式。
  2. 原型(Prototype)模式:將一個對象作為原型,通過對其進行復制而克隆出多個和原型類似的新實例。
  3. 工廠方法(Factory Method)模式:定義一個用於創建產品的接口,由子類決定生產什么產品。
  4. 抽象工廠(AbstractFactory)模式:提供一個創建產品族的接口,其每個子類可以生產一系列相關的產品。
  5. 建造者(Builder)模式:將一個復雜對象分解成多個相對簡單的部分,然后根據不同需要分別創建它們,最后構建成該復雜對象。

 

結構型模式:

  1. 代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強或修改該對象的一些特性。
  2. 適配器(Adapter)模式:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類能一起工作。
  3. 橋接(Bridge)模式:將抽象與實現分離,使它們可以獨立變化。它是用組合關系代替繼承關系來實現,從而降低了抽象和實現這兩個可變維度的耦合度。
  4. 裝飾(Decorator)模式:動態的給對象增加一些職責,即增加其額外的功能。
  5. 外觀(Facade)模式:為多個復雜的子系統提供一個一致的接口,使這些子系統更加容易被訪問。
  6. 享元(Flyweight)模式:運用共享技術來有效地支持大量細粒度對象的復用。
  7. 組合(Composite)模式:將對象組合成樹狀層次結構,使用戶對單個對象和組合對象具有一致的訪問性。

 

行為型模式:

  1. 模板方法(TemplateMethod)模式:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。
  2. 策略(Strategy)模式:定義了一系列算法,並將每個算法封裝起來,使它們可以相互替換,且算法的改變不會影響使用算法的客戶。
  3. 命令(Command)模式:將一個請求封裝為一個對象,使發出請求的責任和執行請求的責任分割開。
  4. 職責鏈(Chain of Responsibility)模式:把請求從鏈中的一個對象傳到下一個對象,直到請求被響應為止。通過這種方式去除對象之間的耦合。
  5. 狀態(State)模式:允許一個對象在其內部狀態發生改變時改變其行為能力。
  6. 觀察者(Observer)模式:多個對象間存在一對多關系,當一個對象發生改變時,把這種改變通知給其他多個對象,從而影響其他對象的行為。
  7. 中介者(Mediator)模式:定義一個中介對象來簡化原有對象之間的交互關系,降低系統中對象間的耦合度,使原有對象之間不必相互了解。
  8. 迭代器(Iterator)模式:提供一種方法來順序訪問聚合對象中的一系列數據,而不暴露聚合對象的內部表示。
  9. 訪問者(Visitor)模式:在不改變集合元素的前提下,為一個集合中的每個元素提供多種訪問方式,即每個元素有多個訪問者對象訪問。
  10. 備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取並保存一個對象的內部狀態,以便以后恢復它。
  11. 解釋器(Interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即解釋器。

 

這些我們平時也都用到了,至少我的項目中已經講過的有:單例、工廠、裝飾器、中介者、代理模式等。

當然這 23 種設計模式,一個框架中肯定可以共存的。

 

 

四、參考文集

 

這里是常見的三本書,當然還有很多,我認為設計模式不是僅僅看書就能解決的,是需要部分代碼和溝通討論的,歡迎來我公眾號或者QQ群,一起交談:

 

(大話設計模式)

 

 

 (Head First 設計模式)

 

 

 (設計模式 第2版)

 

其他網友引用:

 1、https://www.cnblogs.com/cainiao-chuanqi/category/1474597.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM