學習設計模式找不到練手的實戰項目?項目已開源
手寫解析器、渲染器、主題樣式、自定義彈窗和精細的撤銷/恢復機制等。
??整體總結
YtyMark-java 項目,從用戶輸入到用戶查看到實時渲染結果的全過程

-
監聽文本區域內容是否發生變化
-
解析和渲染:“原始文本的塊裁剪”→“塊級元素解析” → “行內元素解析” → “渲染” 四大階段
-
將渲染結果重新刷新展示出來
從UI界面到核心的解析渲染,通過一系列設計模式串聯各模塊,實現了高度的模塊化和可擴展性。
構建者模式
用于構造解析器(ParserBuilder)和渲染器(RendererBuilder),將復雜對象的組裝過程與表示分離,使客戶端只需按需配置各組件即可得到完整的解析/渲染器實例。
先從核心模塊的這四個階段來看設計模式的使用情況。
??1. 原始文本的塊裁剪階段
此階段為“塊級元素預處理”階段,將普通文本按照塊級元素進行裁剪。
狀態模式
主要設計模式為狀態模式:
在“塊級元素預處理”階段,根據當前處理狀態(如普通文本、列表、引用塊等)動態切換處理邏輯,將不同類型的文本裁剪成塊級元素,避免了大量的條件分支。
通過狀態模式實現類似狀態機的機制,當狀態(語法)匹配時,自動流轉到專門處理這個語法的程序,處理完之后分割成一個“塊”(這個塊就是一個塊元素),再回到默認狀態,然后繼續處理后續的文本。具體代碼位于:org.ytymark.parser.block.state包。

??2. 塊級元素解析階段
責任鏈模式
構建一條解析“流水線”,不同的責任對象按優先級依次嘗試處理當前文本塊或嵌套結構,直到有對象成功解析為止,極大提升了解析流程的靈活性。
組合模式
將解析結果組織成一棵 AST(抽象語法樹)塊級元素節點樹,節點既可作為葉子,也可包含子節點,這個階段標題、段落和水平分割線只能是葉子節點,統一對外提供相同的接口,便于樹形結構的構建與遍歷。
整個處理流程,如圖:

關于涉及的相關代碼,可以查看專門簡述核心功能那篇文章。
??3. 行級元素的解析階段
策略模式
動態選擇不同的行內元素解析策略(例如鏈接、加粗、斜體等)以及界面的主題渲染策略(淺色/暗黑主題),通過統一接口切換算法或樣式實現。
組合模式+迭代器模式
通過迭代器結合遞歸來遍歷節點樹,為 AST 提供統一的遍歷方式。在解析階段,用于遍歷塊級元素進行行內元素解析;在渲染階段,遍歷節點樹完成渲染操作。
使用迭代器完成兄弟節點的遍歷(廣度遍歷),再結合遞歸完成子節點遍歷(深度遍歷)。
??4. 渲染階段
中介者模式思想
在 AST、解析器、渲染器之間引入中介邏輯,解耦它們的直接依賴,使得解析和渲染兩者可以靈活組合,支持輸出到不同類型的文檔。

訪問者模式
將節點數據結構與渲染行為分離,在塊級和行級元素解析和渲染時,訪問者對象負責執行相應操作,以解決嵌套調用的復雜性并提高擴展性。在渲染的過程中,組合模式+迭代器模式起到非常關鍵的作用,在渲染階段,使用迭代器完成兄弟節點的遍歷(廣度遍歷),再結合遞歸完成子節點遍歷(深度遍歷),完成節點樹的渲染操作。

后面介紹以工具界面、操作相關的功能。
??5. 樣式相關功能
工廠模式
在渲染器中,根據不同場景創建對應的樣式或渲染器實例,如PDF 等輸出的字體、顏色工廠。
觀察者模式和單例模式
監聽主題(暗黑/淺色)變化或 JavaFX 屬性變化,觸發重新渲染文本內容,保持 UI 與主題狀態同步。主題監聽器將有主題管理類來統一管理,并結合單例模式,使得主題管理器全局唯一,并提供統一訪問入口ThemeManager.getInstance()。
??6. 自定義彈框
自定義通用彈框,在此基礎上根據不同場景進行不同的裝飾
裝飾模式
對基礎彈框組件進行功能性擴展,在不同場景下動態增加或修改對話框行為和樣式,而無需改動原有組件代碼。
??7. 編輯操作
命令模式和備忘錄模式
將菜單項、工具欄按鈕、快捷鍵等操作封裝為命令對象,支持撤銷/重做、宏命令等功能的統一管理。以單次輸入為粒度保存編輯歷史,實現精細化的撤銷與重做,支持一千步的撤銷/重做,并預留撤銷/重做的開啟或關閉。
??8. 界面截圖預覽
白天模式的截圖:

夜間模式的截圖:

??9. 總結
以上即為 YtyMark-java 項目所用的主要設計模式及其在各個功能模塊中的應用場景,既展現了設計模式的實戰價值,也為后續擴展與維護打下了堅實基礎。
??我的開源項目地址
歡迎提交 PR、Issue、Star ??!
如果需要單獨學習這些設計模式,可以在微信公眾號回復:設計模式,來獲取《掌握設計模式:23種經典模式實踐、選擇、價值與思想》pdf手冊。

查看往期設計模式文章的:設計模式

浙公網安備 33010602011771號