为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)
设计模式实战项目:Markdown 文本编辑器软件开发(已开源)
一、项目简介
项目名称:YtyMark-java
本项目是一款基于 Java 语言 和 JavaFX 图形界面框架 开发的 Markdown 文本编辑器。项目不仅具备 Markdown 文本编写、预览、保存、导出等功能,还特别关注软件架构设计的优雅性与可维护性。项目采用多种经典的 面向对象设计模式,实现了解耦、扩展性和高可读性的代码结构。
此外,项目已 开源,旨在为有志于掌握设计模式、文本解析与渲染的开发者提供实战参考。
为什么编写这个项目
纸上得来终觉浅,绝知此事要躬行。单独学习的设计模式始终是理论的学习,实践才是经验的来源,唯有经验才属于自己的。再者,因为很少看到专门用于练手设计模式的实战项目,所以才有了YtyMark-java这个开源项目。该项目主要用于学习设计模式的实战项目,将所学的设计模式用于实战,在实战中领悟真谛。
二、技术栈
编程语言:Java 8
桌面界面框架:JavaFX
构建工具:Maven
核心功能模块:
Markdown 文本解析器
Markdown 语法树(AST)构建
HTML 渲染器
可视化编辑器界面
使用的设计模式(12种):
组合模式:将markdown语法解析结果构建成AST节点树。
构建者模式:创建复杂解析器和渲染器。
状态模式:对markdown文本不同语法做一些前置处理,裁剪成块级元素。
责任链模式:按优先级匹配不同,在"流水线"上处理复杂的块级元素解析及嵌套解析。
策略模式:动态选择解析器完成行内元素的解析和工具界面样式的切换。
迭代器模式:通过迭代器结合递归来遍历节点树,比如遍历块级元素进行行内元素解析和节点树渲染操作。
中介者模式思想:加入AST节点树解耦解析器和渲染器的耦合,使其灵活地渲染成不同的文档。
访问者模式:负责分离节点数据与渲染操作,提高渲染的扩展性;在行内元素嵌套解析时使用访问者模式来解决嵌套调用问题,因为嵌套节点的文本字段是不同的。
工厂模式:样式的创建通过工厂模式来完成。
观察者模式:识别到主题发生变化时执行重新渲染操作;样式切换后,渲染的文字样式也需要同步调整,再结合监听器(观察者模式)来实现主题变化后重新渲染文本内容,除此之外JavaFX使用了大量的监听器。
装饰模式:对自定义基础弹框做定制化的扩展,实现不同场景所需的弹框。
命令模式:封装工具界面中的功能点及快捷键命令。
备忘录模式:负责实现撤销和恢复功能,实现精细到单字符的撤销/恢复机制。
三、功能模块与设计模式应用
1. Markdown 文本解析器
目标:将 Markdown 文本解析为语法树(AST)。
设计模式:
组合模式:表示 Markdown 语法结构(如段落、标题、列表)之间的树形结构。
构建者模式:创建复杂解析器和渲染器。
状态模式:对markdown文本不同语法做一些前置处理,裁剪成块级元素。
责任链模式:按优先级匹配不同,处理复杂的块级元素解析及嵌套解析。
策略模式:动态选择解析器完成行内元素的解析。
迭代器模式:通过迭代器结合递归来遍历节点树,遍历块级元素进行行内元素解析。
2. AST 渲染器
目标:将 AST 语法树渲染为 HTML 文本预览。
设计模式:
迭代器模式:通过迭代器结合递归来遍历节点树,比如遍历节点树完成渲染操作。
中介者模式思想:加入AST节点树解耦解析器和渲染器的耦合,使其灵活地渲染成不同的文档。
访问者模式:负责分离节点数据与渲染操作,提高渲染的扩展性;在行内元素嵌套解析时使用访问者模式来解决嵌套调用问题,因为嵌套节点的文本字段是不同的。
3. JavaFX 用户界面
目标:为用户提供可视化的文本输入、预览、保存、导出(PDF/HTML)和样式切换等功能。
设计模式:
策略模式:动态选择解析器完成工具界面样式的切换。
工厂模式:样式的创建通过工厂模式来完成。
观察者模式:识别到主题发生变化时执行重新渲染操作;样式切换后,渲染的文字样式也需要同步调整,再结合监听器(观察者模式)来实现主题变化后重新渲染文本内容,除此之外JavaFX使用了大量的监听器。
装饰模式:对自定义基础弹框做定制化的扩展,实现不同场景所需的弹框。
命令模式:封装工具界面中的功能点及快捷键命令。
备忘录模式:负责实现撤销和恢复功能,实现精细到单字符的撤销/恢复机制。
注:篇幅原因,功能的详细实现会在后续的文章中再娓娓道来。
四、文本处理流程图

五、模块划分
项目分为两大模块:
UI界面(ytyedit-mark)
markdown文本解析和渲染(ytymark)
YtyMark-java
├── ytyedit-mark/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ ├── editor/ # JavaFX UI 界面
│ │ │ │ ├── enums/ # Icon图标等
│ │ │ │ ├── utils/ # 资源读取等
│ │ │ │ ├── window/ # 自定义窗口(主窗口、弹框)
│ │ │ │ ├── RenderMarkdown # 解析和渲染
│ │ │ │ ├── YtyEditApplication # 主程序入口
│ │ │ └── resources/
│ │ │ └── css/ # 主题样式(CSS)
│ │ │ └── fonts/ # 字体集
│ │ │ └── images/ # 图片
│ ├── README.md
│ └── pom.xml
│
├── ytymark/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ ├── annotation/ # 自定义注解
│ │ │ │ ├── enums/ # 枚举值
│ │ │ │ ├── node/ # 树节点(块级和行级节点)
│ │ │ │ ├── parser/ # 解析器(块级和行级元素)
│ │ │ │ ├── renderer/ # 渲染器(块级和行级元素)
│ │ │ └── resources/
│ │ │ └──
│ ├── README.md
│ └──pom.xml
├── pom.xml
└── README.md
六、截图预览
白天模式的截图:

夜间模式的截图:

支持的语法截图:


七、项目亮点
高度模块化,任何 Markdown 语法都能独立添加/修改。
设计模式实战,适合做设计模式学习的项目。
️ 可按需获取,用户界面和文本解析渲染分为两个模块
只使用用户界面源码,然后轻松切换成熟的解析器依赖,开发一个完整的markdown文本编辑器;
仅学习文本解析渲染模块源码,不用关注用户界面源码。
解析性能毫秒级,确保解析效率。
轻松上手,使用JDK8 自带JavaFX模块,无需做额外处理。
开源项目,文档完善,方便学习和贡献。
八、项目地址(GitHub)
欢迎提交 PR、Issue、Star ️!
你也可以在 Issues 区提出你的建议或想法!
️九、总结
本 Markdown 文本编辑器项目不仅实现了文本解析与图形界面交互,还将多种设计模式融入到实际应用中,是一次系统性的 设计模式实践或架构设计实践。主要目的用于学习设计模式的实战项目,将所学的设计模式用于实战。后续可阅读开源框架源码,剖析优秀的开源项目是如何设计出来的,毕竟YtyMark-java这个开源项目只是练手项目。
更多详细内容可以前往笔者微信公众号回复:设计模式,来获取,后续有关设计模式的新资料都可以从这个入口获取到。
秘籍1设计模式手册:《掌握设计模式:23种经典模式实践、选择、价值与思想》
秘籍2练手项目:设计模式实战项目--markdown文本编辑器软件开发(已开源)

查看往期设计模式文章的:设计模式
为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)的更多相关文章
- 推荐两款富文本编辑器:NicEdit和Kindeditor
做过Web开发的朋友相信都使用过富文本编辑器,比较出名的CuteEditor和CKEditor很多人应该已经使用过,在功能强大的同时需要加载的东西也变得很多.下面要推荐的两款富文本编辑器都是使用JS编 ...
- 是时候选择一款富文本编辑器了(wangEditor)
需要一款富文本编辑器,当然不能自己造轮子.本来想使用cnblog也在用的TinyMCE,名气大,功能全.但是发现TinyMCE从4.0开始,不再支持直接下载.所以还是决定选用wangEditor.遗憾 ...
- 分享基于Qt5开发的一款故障波形模拟软件
背景介绍 这是一款采用Qt5编写的用于生成故障模拟波形的软件.生成的波形数据用于下发到终端机器生成对应的故障类型,用于培训相关设备维护人员的故障排查技能.因此,在这款软件中实现了故障方案管理.故障波形 ...
- 推荐一款C#反编译软件(开源)
大二的时候老师要求做过一个小项目,大概4个人左右一组.当时交流不是特别到位,项目在一个同学的电脑上建成了就一直在他的电脑上(所以好东西不要烂在你的硬盘里),也不知道什么源码管理,可悲到项目做完我还没有 ...
- 我开发了一个产品--Markdown Notes
大家好,我开发了一个工具类软件产品--Markdown Notes,中文名是Markdown笔记.想写一篇有关它的文章,目的就是为了推广.推广.推广:) BTW:本文就是用这个工具所写的.
- QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件
QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...
- python3GUI--用Tk开发一款恶搞蓝屏软件(附源码)
目录 一.准备工作 1.Tkinter 2.科普-电脑蓝屏 二.预览 1.蓝屏-win10.win11(中文版) 2.蓝屏-win10.win11(英文版) 3.Windows其他版本(XP.Win7 ...
- asp.net中两款文本编辑器NicEdit和Kindeditor
过Web开发的朋友相信都使用过富文本编辑器,比较出名的CuteEditor和CKEditor很多人应该已经使用过,在功能强大的同时需要加载的东西也变得很多.下面要推荐的两款富文本编辑器都是使用JS编写 ...
- 我熬夜开发了一款简约实用、支持多平台的Markdown在线编辑器(开源)
前言 之前,一直想开发一款属于自己的Markdown编辑器,主要是自己平常写文章可以更加灵活操作,另外扩宽自己的视野也是非常不错的选择啊!所以在周末就决定玩耍一番.首先我调研了很多线上热门的md编辑器 ...
- linux下10款markdown软件
原文:https://linux.cn/article-7623-1.html 在这篇文章中,我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器. 你可以在 Linux 平 ...
随机推荐
- 玩转云端|够轻松!天翼云边缘安全加速平台AccessOne助力企业解决远程办公难题!
本文分享自天翼云开发者社区<玩转云端|够轻松!天翼云边缘安全加速平台AccessOne助力企业解决远程办公难题>,作者:天翼云社区官方账号 省去早起挤地铁的苦恼,享受居家办公的从容不迫-- ...
- 目前get到最好用的内网穿透软件
官网:https://www.natfrp.com/ 软件名称:SakuraLauncher 不花钱可以获取到两个隧道,如果不想花钱的话,每天签到领流量即可 之前用过cpolar,飞鸽,ngrok,但 ...
- flutter-路由传值携带中文时,报错
解决方案: 路由采用了第三方:fluro 1 Application.router.navigateTo(context, "/searchresult?word=${Uri.encodeC ...
- Scrapy css选择器提取数据
原文学习链接:http://www.scrapyd.cn/doc/185.html 一. 标签属性值的提取 href的值URL的提取:这是最常见的,我们要进入下一页.或是打开内容页--都少不了URL值 ...
- ABB机器人IRB 6700维修保养技巧
通过与子锐机器人维修保养服务定制合理的机器人保养工作,可以确保ABB机器人IRB 6700的持续稳定运行,延长其使用寿命,为企业的生产提供有力保障. 一.ABB机器人IRB 6700日常检查与维护 外 ...
- Go实现动态开点线段树
1.线段树介绍 线段树是一种用于高效处理区间查询和区间更新的数据结构,当我们需要解决一个频繁更新区间值的问题的时候,就可以采用线段树的结构进行解决.线段树的核心思想是将区间分为多个子区间进行管理,越往 ...
- Flink - [08] 状态一致性
题记部分 一.什么是状态一致性 有状态的流处理,内部每个算子任务都可以有自己的状态.对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确.一条数据也不应该丢失,也不应该重复 ...
- C# .net 压缩文件解压上传及文件压缩下载
using ICSharpCode.SharpZipLib.Zip; using System; using System.Collections.Generic; using System.IO; ...
- 【P0】Logisim部件级实验/有限状态机
课上 过得十分狼狈.经鉴定孩子可能脑子拗 T1 投票决议 组内投票,赞成>反对,则通过:组长拥有一票否决权. 信号名 方向 描述 [1:0] s Input 2'b00 赞成2'b01 反对2' ...
- rust学习笔记(3)
变量 变量默认是不可变的 不能使用没有初始化的变量 作用域 变量离开作用域之后会直接释放, 无法再次使用; 在内部代码块中定义的变量会导致外部的变量被遮蔽 类型转换 部分类型可以隐式转换, 部分类型需 ...