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

一句話的事兒,Head first 設計樣式

(點擊上方公眾號,可快速關註)


來源:等你歸去來,

www.cnblogs.com/yougewe/p/8240977.html

head first 設計樣式,是比較有趣的一本設計樣式的書。

在學校里看書和在工作時看書,意義是不一樣的。在學校時是為讀書而讀書,我們可以從0到1,我們有的是時間。但是工作後就不一樣。

我覺得這時的書更像是打通自己任督二脈的武功秘訣。在平時工作中,雜七雜八地學了一些東西,但是卻不能融會貫通。所以還需要通過書來釐清你的思路。這是寫本文的出發點,也是我的碎碎念!

看完該書後,轉換成自己的語言,再表達出來,可能有錯(那是一定的),但是,有總比沒有好。如果有同學能夠從中得到些啟發,也算是自己的一種幸運吧!

我竟試圖以一句話來描述一個設計樣式!

1. 策略樣式!

將統一的東西作為基類,可變的東西行為獨立出來,在基類中通過變數進行取用,通過委托變數的方式,使用setter方法將委托變數改變,使其具有行為可變性。面向接口編程,而非面向類編程。其好處是,用同樣的接口,通過不同行為類的傳入產生不同的效果,便以改變行為變得容易。

2. 觀察者樣式!

類似於發佈-訂閱樣式。存在註冊服務,通知的過程。其實現方式可以理解為,註冊服務時,將觀察者加入到佇列當中,當主題發生變更時,由主題主動依次從觀察者佇列中依次呼叫,從而達到通知主動推送的作用。其好處是,觀察者隨時註冊觀察可以實時收到訊息,而被觀察者對此一無所知,從而在達到通知的同時也解藕了。

3. 裝飾者樣式!

以某物件為主要物件,生成後,將其傳入裝飾者建構式中,經過裝飾後,再行輸出的樣式。該樣式,可以許多散亂的方法獨立組裝出來,而不會影響其他變化,該樣式是通過繼承來實現的。典型的裝飾者樣式運用,java io 類的繼承,有多個主類,及多個裝飾類,從而方便用戶操作想要的方法。其好處是,在大方向不變的情況下,可以反覆更改主要的行為結果,對於一些附加類的變化,可以很方便地通過該樣式進行資料再加工。

4. 工廠樣式!

分為簡單工廠樣式-工廠樣式-抽象工廠樣式。所謂工廠樣式,即是將需要的產品和工廠結合在一起,從而得到一個具體需要的產品的一個過程,而無需知道這個產品具體是由誰生產的。工廠樣式很好的復用了多個產品的變化性,避免了在各個類中進行各自實體化從而導致類的散亂問題。或者從另一個角度來說,工廠只是某段復用性很高的代碼的抽離而已。其好處是,統一把控了一些類的生成,避免了各個類散落在代碼各個角落,從而給後期升級維護帶來方便。

5. 單例樣式!

就是全域性只有一個實體物件的訪問方式(單行程方式)。需要一個私有建構式,使外部無法實體化他,需要一個靜態方法getinstance供外部訪問實體使用,屬於懶加載行為。但應註意多執行緒併發問題,從而創建兩個instance,使用synchronized同步方法或者volatile同步本實體,從而解決併發問題,但是這會導致應用性能降低100倍的性能。當應用中大量使用單例,就得考慮是否合理了,因為適合單例的場景並不很多。其好處是,減少系統反覆創建一個類時的性能開銷及空間開銷,且可以多處共享一些變數(如果需要的話)。

6. 命令樣式!

將請求當作物件傳遞給另一物件,從而實現命令的執行方式。使請求與執行解藕開來,可以很方便地實現命令集操作,或者宏操作及回放。能夠輕鬆實現日誌佇列操作。其好處是,將命令請求和命令執行分開,一般請求都會很快完成,但是執行卻不一定,由於請求與執行分開,所以能夠輕鬆實現事後補償的動作。

7. 配接器者樣式!

即實現A接口轉換B接口的適配工作,如實現連接三角插座與兩腳插頭連接工作,配接器的意義在於不用改變或不能改變現有接口的同時,將新的接口接入現有環境,意義重大。其實現為,配接器繼承標的接口,並傳入被適配接口,將被適配接口的邏輯轉換成標的接口的表述。可以繼承多個接口實現雙向轉換。其好處是,不對現有代碼進行改動的情況下接入新廠商的東西,適應原有方式。

8. 外觀樣式!

外觀樣式的意圖在於提供簡化的接口操作,同時,也不改變原有接口。其實現是一種類的包裝簡化。其遵循一個設計原則,只與最親密的人交談。其好處是,將原有複雜多變的接口轉化為少且實用的幾個接口,使外部呼叫時,只做最簡單的事。

9. 模板方法樣式!

在一個父類接口中定義一個演算法骨架或者操作流程,並將一個子類特有的方法以抽象方法的方式暴露出來,使在運行時使用父類的操作流程呼叫子類的特有方法的方式。該樣式可以省去許多機械代碼,使子類只關註自己特有的部分。本樣式中,還有一個平凡而重要的概念,鉤子hook,鉤子在java中表現出來就是,一個只有空的方法或者預設實現的方法,子類只要對該方法進行改寫,就可以觸發鉤子,從而實現開關控制和自己的意圖。因為是高層呼叫低層,所以存在有些操作的不明顯,如果低層又呼叫高層的話,將很難搞清楚設計,因此應遵循一個原則,好萊塢原則,只有父類呼叫子類,子類不得呼叫父類,因此如果想知道框架中為什麼要讓你必須實現某個方法時,只需到父類中查看其呼叫一下便知,但不得私自呼叫父類方法。依賴倒置原則和這有點像。其好處是,將複雜流程封裝起來,只提供可變的方法讓子類重寫,從而在父類呼叫,減少許多重覆的代碼。

10. 迭代器樣式!

也就是實現像iterator 接口一樣功能的方式,使物件能夠不關註內部實現的情況下遍歷元素。目前對我們來說,應該是沒什麼意義了,因為類似於for in 的語法,已經完全能夠達到此類效果,該樣式個人感覺沒多大意義。其好處,就是為了方便使用的地方能夠遍歷出內部結構。

11. 組合樣式!

即將多個接口具有的方法,組合在一起變為一個更大的接口,讓操作者無需關註各類的差異,只管呼叫相同接口即可,但是對於有些子類沒有的方法則需要丟擲異常,以使外部進行捕獲。使用場景得細細思量一番才行。這個功能,在gui編程時最明顯,當你拖動幾個系統提供的組件,在頁面上組合出新的結構時,就是利用了組合樣式了。

12. 狀態樣式!

與策略樣式類似。其作用是控制外部操作在內部的狀態流轉,並無需讓外部知曉,其操作其實是將一系列的if else解放出來,使邏輯更清晰。其實現為封閉整個流程的所有狀態,在用戶操作某一狀態後,該狀態只會做自己的事,並將狀態轉換到下一狀態,用戶進行下一操作時,內部已改變,但是對類內部來說,操作的仍是單一狀態,因此邏輯清晰。但是該樣式會產生大量狀態類,增加大量代碼,且需抽象出良好的狀態,比較考驗技術水平。其作用是,便邏輯更清晰,也更容易擴展。

13. 代理樣式!

即訪問物件不通過直接訪問的方式,而是去訪問代理讓代理去跟具體物件溝通,溝通好後將結果傳回給訪問者,這裡一般會涉及到rmi遠程呼叫,代理樣式減小了系統的複雜度(至少到呼叫者是的)。虛擬代理,快取代理,同步代理,防火牆代理,寫入時複製代理。代理樣式在現實中用的是非常廣泛的,他為我們屏蔽許多複雜細節,由框架提供的代理,使我們操作方便的同時,也讓我們變得傻瓜。

14. 複合樣式!

即組合混合使用了多個樣式的樣式,該樣式準確說不算是樣式,但是也在框架中體現的最多的樣式,如著名的mvc。組合策略,配接器,觀察者,裝飾器,組合樣式,工廠等等。其好處是,在基礎樣式的基礎上,再封裝出另一實用樣式,解決更具體的應用場景問題。

15.更多!

樣式是某種情境下針對某種問題的某種解決方案。其他樣式,訪問者樣式,中介樣式,原型樣式,橋接樣式,責任鏈樣式,。反樣式,即不好的樣式,錶面看起來好,實際用之後會有大坑。

沒有最好,只有最合適。這句也非常適合於描述設計樣式。另外,在工作中試著用用套路,然後再從套路中走出來,這叫成長。

看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,提升Java技能

赞(0)

分享創造快樂