【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝發表於2019-05-13

【肥朝】從JDK中,我們能學到哪些設計模式?

【肥朝】從JDK中,我們能學到哪些設計模式?

結構性模式:

介面卡模式:

常用於將一個新介面適配舊介面

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:在我們業務程式碼中經常有新舊介面適配需求,可以採用該模式。

橋接模式:

將抽象和抽象的具體實現進行解耦,這樣可以使得抽象和抽象的具體實現可以獨立進行變化。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個模式,其實我們每天都在用到,但是你可能卻渾然不知。只要你用到面向介面程式設計,其實都是在用橋接模式。

組合模式

讓客戶端看起來在處理單個物件和物件的組合是平等的,換句話說,某個型別的方法同時也接受自身型別作為引數。(So in other words methods on a type accepting the same type)

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:從上面那句英文我們就可以得知,組合模式常用於遞迴操作的優化上,比如每個公司都有個boss系統,都會有什麼選單的功能。比如一級選單下有二級選單,二級選單又有三級選單。刪除一級選單的時候需要不斷刪除子選單,那麼這個設計模式你可以試試。總之,凡是有級聯操作的,你都可以嘗試這個設計模式。

裝飾者模式

動態的給一個物件附加額外的功能,因此它也是子類化的一種替代方法。該設計模式在JDK中廣泛運用,以下只是列舉一小部分

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個模式使用就太廣了,我們常用的AOP,既有動態代理,也有裝飾者的味道。

門面模式

為一組元件,介面,抽象或子系統提供簡化的介面。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:我們每天使用的SLFJ日誌就是門面日誌,比如我們使用Dubbo,向外提供的服務就儘量採用門面模式,然後服務在呼叫各種service做聚合。

享元模式

使用快取來減少對小物件的訪問時間

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:只要用到了快取,基本都是在使用享元模式。很多同學都說自己的專案太low了,都沒有用到什麼設計模式,這不是開玩笑嗎,你用個map快取幾個物件,基本上都運用了享元的思想。

代理模式

代理模式用於向較簡單的物件代替建立複雜或耗時的物件。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:代理模式用得很廣泛,基本所有大家知道的開源框架,都用到了動態代理。

建立模式

抽象工廠模式

抽象工廠模式提供了一個協議來生成一系列的相關或者獨立的物件,而不用指定具體物件的型別。它使得應用程式能夠和使用的框架的具體實現進行解耦。在JDK和許多開源框架,比如Spring中隨處可見,它們很容易被發現。任何用於建立物件但返回介面或抽象類的,就是抽象工廠模式了。(any method that is used to create an object but still returns a interface or abstract class)

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:從英文就可以得出,該模式可以與策略模式結合使用。

建造者模式

用於通過定義一個類來簡化複雜物件的建立,該類的目的是構建另一個類的例項。構建器模式還允許實現Fluent介面。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個在我們業務程式碼中使用的場景太廣泛了。比如訂單系統大部分專案都有,訂單物件就是一個複雜物件,我們就可以採用建造者模式來做。

工廠方法

只是一個返回實際型別的方法。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個屬於大家都會的設計模式,不多過介紹。

原型模式

使得類的例項能夠生成自身的拷貝。如果建立一個物件的例項非常複雜且耗時時,就可以使用這種模式,而不重新建立一個新的例項,你可以拷貝一個物件並直接修改它。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個你以為是冷門的設計模式,其實錯了,這個是大熱門的設計模式。比如我們業務程式碼,經常要各種DTO、BO、DO、VO轉換,其實就可以參考原型設計模式的思想來做。

單例模式

用來確保類只有一個例項。Joshua Bloch在Effetive Java中建議到,還有一種方法就是使用列舉。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:在平時開發中,單例是我們用得最多的了,因為Spring的bean,預設就是單例級別的。單例屬於大家基本都會的設計模式。

行為模式

責任鏈

通過把請求從一個物件傳遞到鏈條中下一個物件的方式來解除物件之間的耦合,直到請求被處理完畢。鏈中的物件是同一介面或抽象類的不同實現。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:凡是帶有Filter關鍵詞的,基本都在用這個設計模式。在業務程式碼使用的場景實在是太多了,用到攔截器的地方基本都在用這個設計模式。

命令模式

將命令包裝在物件中,以便可以將其儲存,傳遞到方法中,並像任何其他物件一樣返回。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:命令模式使用頻率較高,和策略模式比較像,具體區別可以搜尋一下。如果用過Activiti工作流引擎的朋友可以看一下里面的原始碼,很多地方都用到了命令模式。

直譯器模式

此模式通常描述為該語言定義語法並使用該語法來解釋該格式的語句。(This pattern generally describes defining a grammar for that language and using that grammar to interpret statements in that format.)

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個比較冷門,肥朝沒怎麼用過,你用過的話可以留言告訴肥朝。

迭代器模式

提供一個統一的方式來訪問集合中的物件。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個中介軟體和基礎框架組的同學可能用得比較多,業務程式碼的話用得不多,不過JDK中的這種使用很經典,可以看看。

中介者模式

通過使用一箇中間物件來進行訊息分發以及減少類之間的直接依賴。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:看到這個描述不用我多說什麼,業務程式碼使用的場景太多了。比如你們用MQ,其實就是在用中介者模式。所以肥朝一再強調,即使是每天CRUD,關注肥朝一起學習,也能給你的CRUD專案,加上美顏+濾鏡(設計模式)的加強效果。

備忘錄模式

生成物件狀態的一個快照,以便物件可以恢復原始狀態而不用暴露自身的內容。比如Date物件通過自身內部的一個long值來實現備忘錄模式。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個在業務中使用得不多,據肥朝瞭解其中一種場景是,你要把資料丟到MQ,但是MQ暫時不可用,那麼你把資料暫存到DB,後面再輪詢丟到MQ。如果你有更好的場景,留言告訴肥朝。

空物件模式

它允許您抽象空物件的處理。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個業務程式碼用得不多,但是JDK中的這幾個方法我們倒是挺常用的。

觀察者模式

用於為元件提供一種靈活地向感興趣的接收者廣播訊息的方式。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:我們業務程式碼一般是基於Zookeeper來做觀察者的。基本上用到ZK的地方,都是在用觀察者模式,比如分散式鎖,比如服務發現等。

狀態模式

允許您在執行時根據內部狀態輕鬆更改物件的行為。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個在業務程式碼用得就太廣泛了,我就不信你們系統還沒有“狀態”了。比如我們常見的訂單狀態或者各種XX狀態,都可以用得上。

策略模式

使用這個模式來將一組演算法封裝成一系列物件。通過呼叫這些物件可以靈活的改變程式的功能。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個太高頻了,常用於優化大量的if-else,如果這個設計模式都不會,出去不要說關注過肥朝的公眾號!

模板方法模式

讓子類可以重寫方法的一部分,而不是整個重寫,你可以控制子類需要重寫那些操作。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個模式也是非常高頻的模式。業務程式碼中經常遇到有很多相同的部分,我們可以做一個抽象類,子類來實現差異化,如果還不知道的,趕緊搜尋一下,再次強調,非常高頻。

訪問者模式

提供一個方便的可維護的方式來操作一組物件。它使得你在不改變操作的物件前提下,可以修改或者擴充套件物件的行為。

【肥朝】從JDK中,我們能學到哪些設計模式?

肥朝小聲逼逼:這個肥朝使用的頻率不高,如果你有在業務程式碼中使用,歡迎留言告訴肥朝。

寫在最後

【肥朝】從JDK中,我們能學到哪些設計模式?

相關文章