- 貫穿設計模式:用一個電商項目詳解設計模式
- 偉山育琪
- 2546字
- 2024-12-28 11:44:52
前言
致敬所有程序員
我們生而平凡,卻因思維和雙手而閃亮。人有居廟堂,人有守邊疆,或許沒有聚光燈下的萬眾矚目,沒有絕倫逸群的青史留名,但總有那一隅角落,有我們揮灑汗水和青春的字里行間,千家燈朦朧,萬里夜長空,致敬最美夜行者。
然,人間沒有永恒的夜晚,世界沒有永恒的冬天,程序改變世界。
定,春風和煦,韻律協調,擊壤而歌,同憂同行,為太平故,負重前行,為靜好故。
終,世界以你為榮。
益者三友,損者三友。友道,友諒,友多聞,益矣。友便辟,友善柔,友便佞,損矣。
愿,君以書為友,日以數篇為率,書遂大進。
盼,平生于書,未嘗茍且,或達人簡札,少不當意,必再三易之不厭。
遂,愈老而愈益精妙。
士有諍友,則身不離于令名。
期,君視吾為諍友,交友投分,切磨箴規,同心而共濟,始終如一。
雖,不可即高山流水,仍盼鼓琴以為眾善聽,為君子交,淡以親,相知無遠近,萬里尚為鄰。
終,達之所成亦不離道。
謹以此書,致敬所有程序員,致敬那無數黑夜中的嗚咽與怒吼,致敬最卑微的程序夢,致自己,致青春——You look great today!
學習設計模式普遍存在的問題
以下是來自眾多從業者對設計模式的看法和疑問。
· 設計模式真的有用嗎?你敢不敢告訴我你項目里用了什么設計模式?
· 看設計模式有什么用?天天造車工廠、肯德基點餐、披薩制作……哎!
· 除了工廠和單例,兄弟們有沒有真實用過其他設計模式的?
· 可能只有做架構代碼的時候才會用設計模式吧,就像Spring源碼那樣用了不少設計模式,自己寫的項目里感覺沒什么可以用的點。
· 可能面試官也沒在項目里用過幾個,就是隨便問問(偷笑)。
……
上邊所列舉的點是否也正是你的內心想法呢?設計模式給大部分讀者的感覺就是“神秘”“高端”“不接地氣”“學會容易落地難”。好不容易有幾個能夠落地到項目中的設計模式,還被框架代碼完美封裝了。比如:
· Spring的Bean管理:在不顯示使用Scope注解為prototype的前提下,默認情況就是使用的單例Bean,想自己寫單例,Spring不給你機會。
· 迭代器模式:JDK中List源碼也好,Map源碼也好,這些常用的數據結構都為我們提供了迭代器——iterator,想自己寫迭代器,要先過JDK這關。
· 觀察者模式:很多事件的監聽場景適合使用該設計模式,可無奈的是Redis提供了發布/訂閱功能;Spring框架提供了Listener注解;更多情況下,項目中要完成事件消息的傳遞,必然會引入消息中間件,如RabbitMq、Kafka;使用Spring Cloud Alibaba的企業,更多地會使用RocketMq進行事件消息的傳遞,一個監聽場景被輕易地修改為了以中間件為基礎的消息傳遞和消息接收,而且耦合度還降低了。嘆息自己一身武藝,卻無用武之地。
……
難道這輩子自己只能寫工廠設計模式了嗎?還是簡單工廠模式……
內容簡介
· 不切實際的代碼示例(如造車工廠、肯德基點餐、披薩制作、適配USB接口、裝飾咖啡加牛奶糖等)請繞行。
· 不切實際的設計模式原則描述(如老師、學生單一職責原則劃分,駕駛不同品牌車輛的依賴倒置原則設計等)請繞行。
很抱歉以這種形式進行本書內容簡介的開場,也希望廣大讀者給予諒解。筆者認為,如果依然以如此虛幻的示例展開對設計模式的講解,那么本書也就失去了它原有的意義。因為在網絡開放的當下,很多免費的博客論壇中,這種設計模式的代碼示例比比皆是,我們何必浪費金錢和時間在這本書上?而我們作為開發行業的從業者,迫切需要的并不是虛無縹緲,而是真正可以落地的設計模式。
本書所有設計模式的代碼編寫,全部基于互聯網項目核心需求,杜絕不切實際的代碼示例,讓設計模式融入真實的項目開發之中,讓設計模式為我們的項目效力。即便是第1章內容對設計模式六大原則(合成復用原則在1.4節單獨說明)的講解,依然以熱門源碼(如JDK8源碼、Spring5源碼)為示例展開。
除第1章介紹設計模式的原則和分類,以及第12章進行結語以外,其他章節依次以互聯網項目核心模塊為基準,將設計模式融入核心模塊的開發之中,整個過程猶如一個整體項目需求,完成設計模式的融入。
從第2章到第11章,依次對核心項目模塊進行設計模式的融入,本書所涉及的核心模塊如下。
· 多種類第三方賬號登錄。
· 商品類目管理。
· 商品訂單狀態轉化與處理。
· 多種類第三方支付。
· 業務投放。
· 平臺積分更新及紅包發放。
· 開具電子發票。
· 朋友代付。
· 訂單審計日志設計。
· ES日志查詢。
本書的目標是讓設計模式在工作中的使用成為可能,讓我們對設計模式的學習不僅僅停留在表面上。希望本書對設計模式的實踐和落地,能夠引起讀者共鳴,能夠為讀者在未來的工作中提供些許參考。
如何學習本書
對于設計模式的初學者,筆者建議從第1章開始閱讀,了解設計模式的原則及分類,對設計模式有一個全局概念之后,再依次進行后續章節的學習。對于已經了解設計模式的讀者,可以根據自身情況跳過第1章的學習,直接從第2章進行學習。
除此之外,筆者對閱讀本書的讀者仍有以下建議:
①本書所涉及的所有代碼示例,可以掃描書中的“全書源碼”二維碼獲取。但建議讀者不要提前獲取全部代碼,而是跟隨章節的內容親自進行代碼的編寫,體會設計模式的精妙之處。
②本書涉及的相關第三方組件的安裝包及安裝方式,如RabbitMq、Apollo等,均可掃描前言中的配套二維碼獲取。同時,為了感謝讀者的支持和認可,本書贈送“Spring源碼視頻資料”,由筆者親自錄制,依然在前言中通過二維碼處獲取。
③希望廣大讀者理解,一個項目需求可以有多種代碼實現方式,或簡單,或復雜,或單一直接,或可擴展。實現方式的恰當與否,完全視業務場景以及對代碼的封裝性、擴展性、可維護性等一系列要求而定。本書的內容只是多種實現方式中的一種,歡迎讀者能夠將自己的想法傳達給我,我們互相討論,共同進步。
④本書與傳統的設計模式講解順序有所不同,傳統的講解順序會按照設計模式的三大類型(創建型、結構型、行為型)進行講解,而本書以互聯網項目需求為核心展開設計模式講解,與傳統的講解方式大相徑庭,希望讀者能夠調整學習思路和方式。
接下來讓我們開啟這次旅程吧,一起進步,加油!
書友技術群
筆者為廣大書友創建了QQ書友技術群,我們不僅可以討論本書涉及的技術內容,還可以討論行業內任何有價值的技術,共同創建一個良好的技術交流環境。筆者也會經常在群中為大家分享更多的學習資料,并進行技術交流。請掃描下方二維碼入群。
本書提供了詳細的配套資料,讀者可以掃描下方的二維碼進行下載。

全書源碼

[第6章]MySQL 5.6.10安裝包

[第6章]Apollo quick start

Spring源碼視頻資料

[第7章]RabbitMq安裝包

[第7章]rabbit.queue.create-0.0.1-SNAPSHOT

[第11章]es.demo.server-0.0.1-SNAPSHOT