初級JAVA程序員應該掌握的設計模式知識(超級通俗易懂)

爲什麼要學習設計模式?

別問,問就是面試需要。面試需要是最低層次的原因,再高一層次的原因是,設計模式就類似於一套在大部分時候都很有用的套路,使用設計模式之後,自己的代碼往往更加有可讀性,拓展性。當別的程序員看你寫的代碼的時候,他能很快的明白你的代碼邏輯。再高一層次的原因自然就是這個是高級程序員的基本操作,總之,真的很重要哦。

對於想學設計模式的程序員來說,我的建議是先對Java的基本知識有所瞭解,甚至於比較熟悉之後,再看設計模式。不然的話,就可能印象不深刻。對於已經熟悉Java的基本知識的程序員,我的建議是直接看書,並認真做筆記。或者看下面我對每個設計模式的理解,遇到相似的問題的時候,嘗試使用設計模式來實現需求。或者當你看完這本書,再看下下面我的理解,可以跟我交流一二,這樣更好。

設計模式需要掌握哪些內容?

我認爲,就是當你遇到一個具體問題,你可以很快的從自己的知識庫中把自己知道的設計模式取出來,加上你自定義的設計模式,然後知道使用哪個設計模式,就可以了。以下是書裏提到的幾個重要的設計模式的簡單介紹。

初級JAVA程序員系列

項目地址,歡迎STAR

策略模式

當你要實現多個具有相似行爲的類時。你可以使用定義父類然後子類繼承的方法,但這樣做的時候,我們在實現子類的時候無形之中引入了可能不需要的父類的方法。

所以我們可以使用策略模式的思想來做同樣的事情。策略模式的主要思想:多用組合,少用繼承

我們可以將行爲定義成接口,這樣具有相似行爲的類就可以做到類跟行爲的接口,按需實現接口,也就是擁有行爲。

觀察者模式

觀察者模式簡單來說,思想大概就是你(觀察者)關注(訂閱)了某個公衆號(主題對象),公衆號發佈新文章的時候,微信就會通知你,你就可以看到新的文章。

裝飾者模式

裝飾者模式的思想是:在不改變原有對象的基礎之上,將功能附加到對象上,適合給類拓展功能的場景,且是一層套一層的。就像小時候學校裏賣的餅一樣。原價5元,裝飾一層火腿腸,價格變爲5+1元,在裝飾一個雞蛋,價格變爲6+1元。

工廠模式

我琢磨了一下,我們玩王者榮耀時選英雄以及王者榮耀創建對應的英雄,生成地圖,生成技能等過程應該算是一種工廠模式,首先B-P階段,我們選擇一個英雄名字頭像,王者榮耀就要根據英雄名字來生產一個英雄,然後產生對應的英雄和相應的技能以及技能對應的效果。好,我現在出一個面試題,“請根據王者榮耀選英雄的過程,寫出對應的工廠模式類圖”。

直接上《Head First》時的筆記:
所有的工廠都是用來封裝對象的創建;簡單工廠雖然不是真正的設計模式,但仍不失爲一個簡單的方法,可以將客戶程序從具體類解耦;工廠方法使用繼承,把對象的創建委託給子類,子類實現工廠方法創建對象;所有工廠模式都通過減少應用程序和具體類的依賴促進松耦合;工廠方法允許類將實例化延遲到子類進行;工廠是很有威力的技巧,幫助我們針對抽象編程,而不要針對具體類編程。

單件模式

單件模式是一種節約系統資源,提高系統性能的一種手段,也有助於管理對象。例如我們的手機App,我們發現,每次打開的都是之前打開過的或者是新創建的App對象,如果每次我們每次點擊圖標,安卓系統都給我們new一個App對象,那必將造成資源的浪費,也不方便我們進行操作管理。

命令模式

假設有一個機器人要給你做飯,Ok,假設你可以通過語音控制它,你可以這樣命令它:去切菜,去開火,去倒油,都放進去,給我炒他,鏟子剷出來,送到客人那邊去!機器人怎麼會知道做飯呢,但是你通過這幾個獨立的命令就讓他實現了做菜並送物的功能,如果你只執行最後一個命令:送到客人那邊去!機器人就實現了送物機器人的功能。

適配器模式

在計算機領域有一句至理名言:遇到問題的時候,通過多加一層就可以解決。這一思想就類似我們的適配器模式。

這個大家應該都知道吧,就不多講了。舉個例子,Docker就是Linux和JVM之間的一層適配器,Docker真香!

模板方法模式

世界上的人可能有一個共性,就是早上喫飯,中午喫飯,晚上喫飯。每個人的一天裏都有這樣幾個階段。那一日三餐就是一個模版方法,其中每個人實現模版的具體方法又不一樣。當然可能996的你顧不上喫早餐了,就相當於你實現模版方法的喫早餐的時候執行的是今天喫空氣(必須實現模版方法,此時的你就類似於代碼裏拋出一個異常)。

可以參考我的這篇文章。

迭代器與組合模式

簡單來說就是,你的代碼用一個for循環做了一件事情,你的同事用while循環做了一件相似的事情,你還有一個同事,直接對每個過程手動遍歷(例如手動調用xxList.get(0),xxList.get(1)…)這個時候呢,你的領導可能會寫一個更加通用的代碼來替代你們三個人的代碼,他可能就會使用Iterator,所以他能成爲領導嘛。

狀態模式

我這篇文章除了模版模式和MVC模式之外,應該還用到了狀態模式,就是定義不同發病階段的狀態,然後執行代碼,感興趣的可以詳細看一下。

代理模式

什麼是代理呢,比方說你自己寫了一個軟件,你想弄一個軟件著作權的證,原本可能你需要跑到北京,自己要跑一系列複雜的程序,這可能是很麻煩的,後來有人告訴你,你可以在淘寶找個代理,把信息發給他,他就會幫你做這樣一系列事情。最後,你在感知不到 的情況下辦理了軟件著作權,這就是通過代理。

代理模式的好處是當你要增加修改業務功能(上文中的弄一個軟件著作權的證)時,在不改變原有對象的情況下(不去親自跑),引入代理類實現(找代理幫你弄)。

Spring的面向切面編程也是基於動態代理來實現的。在使用Mybatis的時候,我們只實現了xxMapper接口,卻直接快樂的CURD,這背後,也是通過動態代理生成代理類的方式實現的,這種壞處顯而易見,不跳出舒適圈的人,最後可能還在快樂的CURD。而面試的時候,就比較喫虧了。

設計模式的共性

設計模式的共性就是他的六大基本原則:
單一職責原則:良好類的基礎
開閉原則:讓程序更加穩定靈活
裏式替換原則:讓類的拓展性更強大
依賴倒置原則:擁抱變化吧,程序員!
接口隔離原則:你實現你的,不必管我感受
迪米特原則:去拓展自己吧,程序員!

碎碎念

就像那句話,他們說這些設計模式你或多或少都遇到過,只是不知道他是設計模式罷了。

好像這幾種設計模式我都見到或者用到過,真奇妙。

推薦書籍

《Head First設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章