歡迎光臨
每天分享高質量文章

從JDK中,我們能學到哪些設計樣式?

來自:肥朝(公眾號ID:feichao_java)
參考外國文獻:https://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html

結構性樣式:

配接器樣式:

常用於將一個新接口適配舊接口

肥朝小聲逼逼:在我們業務代碼中經常有新舊接口適配需求,可以採用該樣式。

橋接樣式:

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

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

組合樣式

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

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

裝飾者樣式

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

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

門面樣式

為一組組件,接口,抽象或子系統提供簡化的接口。

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

享元樣式

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

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

代理樣式

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

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

創建樣式

抽象工廠樣式

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

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

建造者樣式

用於通過定義一個類來簡化複雜物件的創建,該類的目的是構建另一個類的實體。構建器樣式還允許實現Fluent接口。

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

工廠方法

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

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

原型樣式

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

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

單例樣式

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

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

行為樣式

責任鏈

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

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

命令樣式

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

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

解釋器樣式

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

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

迭代器樣式

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

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

中介者樣式

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

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

備忘錄樣式

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

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

空物件樣式

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

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

觀察者樣式

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

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

狀態樣式

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

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

策略樣式

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

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

模板方法樣式

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

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

訪問者樣式

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

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

寫在最後

你專案都用到了哪些設計樣式?亦或者上述設計樣式你在實際業務代碼中有更好的場景。

    已同步到看一看
    赞(0)

    分享創造快樂