1. 程式人生 > >一句話的事兒,Head first 設計模式

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

因此 實例 模板方法模式 抽象方法 class 包裝 作用 自己的 定義

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。組合策略,適配器,觀察者,裝飾器,組合模式,工廠等等。其好處是,在基礎模式的基礎上,再封裝出另一實用模式,解決更具體的應用場景問題。

16.更多!

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

    來源:等你歸去來
    鏈接:http://www.cnblogs.com/yougewe/p/8240977.html

更多幹貨領取可關註公眾號後回復“幹貨”即可免費領取海量幹貨

技術分享圖片

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