【温故知新】设计模式

设计模式

一、23种设计模式

设计模式

分类 模式名称 一句话定义 核心要点 典型应用场景
创建型(5种) 单例Singleton 保证一个类只有一个实例 私有构造、全局访问点 日志管理器、数据库连接池、配置对象
工厂方法Factory Method 定义创建对象的接口,由子类决定实例化谁 类级别、依赖继承 日志记录器(文件/数据库)、支付渠道选择
抽象工厂Abstract Factory 创建一组相关或相互依赖的对象族 对象组合、拒绝多if-else 跨平台UI组件(Win/Mac按钮和文本框)
建造者Builder 分步构建复杂对象,分离构造与表示 链式调用、Director指挥 SQL查询构造器、StringBuilder、复杂订单
原型Prototype 通过拷贝现有对象来创建新对象 实现Clone接口、浅/深拷贝 游戏怪物克隆、对象初始化成本高的场景
结构型(7种) 适配器Adapter 将一个类的接口转换成客户端期望的接口 包装器、兼容旧代码 电源转接头、第三方SDK接口适配
桥接Bridge 将抽象与实现分离,让它们独立变化 组合优于继承 消息发送(抽象:普通/紧急 vs 实现:邮件/SMS)
装饰器Decorator 动态地给对象添加职责,比继承灵活 层层包裹、透明扩展 Java I/O流 (BufferedInputStream)
代理Proxy 为对象提供一个代理以控制访问 中介、延迟加载 虚拟代理(图片懒加载)、权限代理
外观Facade 为复杂的子系统提供一个统一的简单接口 简化调用、降低耦合 JDBC封装、启动电脑(一键开机)
享元Flyweight 共享细粒度对象,减少内存消耗 池化技术、内部/外部状态 字符串常量池、围棋棋子(颜色共享)
组合Composite 将对象组合成树形结构以表示”部分-整体” 递归结构、一致对待 文件系统(文件夹与文件)、组织架构树
行为型(11种) 策略Strategy 定义一系列算法,封装起来,让它们可互换 消除大量条件判断 电商促销策略(满减/折扣/返现)、排序算法
观察者Observer 定义一对多的依赖,当一个对象改变时通知所有依赖者 发布-订阅机制 事件监听(Button点击事件)、RxJava
命令Command 将请求封装成一个对象,支持撤销和排队 解耦请求者与执行者 菜单按钮操作、宏命令、线程池任务
模板方法Template Method 定义算法骨架,将某些步骤延迟到子类 钩子方法、代码复用 数据库访问流程(连接-执行-关闭)、JUnit
状态State 允许对象在其内部状态改变时改变它的行为 用多态代替if-else 订单状态流转(待支付/已发货/已完成)、电梯状态
责任链Chain of Resp. 将请求沿着处理链传递,直到被处理 解耦发送者和接收者 审批流、Servlet Filter、拦截器
备忘录Memento 在不破坏封装的前提下,捕获并恢复对象状态 快照机制 编辑器撤销(Ctrl+Z)、游戏存档
中介者Mediator 用一个中介对象封装一组对象的交互 减少对象间耦合 聊天室(通过服务器转发)、MVC的Controller
访问者Visitor 将作用于某对象结构的操作分离出来封装 数据结构稳定,操作易变 编译器(AST节点遍历)、报表生成器
迭代器Iterator 提供一种方法顺序访问聚合对象中的元素 统一遍历接口 Java Collection的 iterator()for-each
解释器Interpreter 给定一个语言,定义其文法的一种表示,并解释执行 语法树解析 正则表达式引擎、SQL解析、数学表达式计算

二、MVX设计模式

MVX设计模式

模式 全称与核心组成 数据流与交互逻辑 优点 缺点 典型应用场景
MVC Model-View-ControllerM: 数据/业务• V: 界面展示• C: 接收输入,调度M/V 双向混乱View常直接读Model,Controller同时操控View和Model。很多实现中V和C紧耦合(如iOS)。 • 概念简单,易上手• 开发速度快(小项目) Controller臃肿(Massive VC)• View与Model耦合,难测试• 逻辑分散,维护困难 • 早期Web开发(PHP/JSP)• iOS原生开发(Apple MVC)• 简单Demo或小型工具
MVP Model-View-PresenterM: 数据/业务• V: 被动视图P: 纯逻辑调度 单向清晰View <-> Presenter <-> Model。View只负责画UI,通过接口通知Presenter;Presenter持有View接口,更新UI。 彻底解耦(V与M互不知晓)• Presenter无Android/iOS Context,极易单元测试• 逻辑集中,易于维护 • Presenter易臃肿• 手动更新UI繁琐(需写大量setText等代码)• View接口可能过多 • 传统Android开发• WinForms/ASP.NET Web Forms• 需要高测试覆盖率的项目
MVVM Model-View-ViewModelM: 数据/业务• V: 界面展示• VM: View的抽象模型 双向绑定View <-> (Binder) <-> ViewModel。View与ViewModel通过框架自动同步(Data Binding),无需手动调用。 开发效率极高(消灭样板代码)• 数据驱动,代码简洁• 比MVP更解耦,测试性良好 调试困难(数据流向不直观,难定位Bug)• 内存泄漏风险(绑定未释放)• 复杂逻辑导致ViewModel膨胀 前端主流(Vue/React/Angular)• WPF/UWP• Android Jetpack (LiveData/DataBinding)• 数据密集型应用
MVPVM MVP + MVVMM: 数据• V: 视图• P: 业务逻辑VM: 数据包装 双轨制View <-> Presenter <-> ViewModel <-> Model。P负责逻辑,VM负责适配数据供V绑定。 • 兼具MVP的强测试性和MVVM的高效率• 职责分离更彻底(P只管逻辑,VM只管数据) 架构复杂,学习成本高• 类数量翻倍,代码量较大• 小型项目杀鸡用牛刀 • 大型桌面应用(WPF)• 复杂企业级移动应用• 需要严格分层的大型项目
VIPER View-Interactor-Presenter-Entity-RouterV: UI展示• I: 业务逻辑/用例• P: 格式化数据• E: 实体• R: 路由/导航 单向闭环View -> Presenter -> Interactor -> Entity。严格遵循Clean Architecture,每一层只做一件事。 职责切分到极致• 极高的可测试性和模块化• 代码极其规范,适合团队协作 类爆炸(一个页面5+文件)• 极度繁琐,开发效率低• 学习曲线非常陡峭 • 超大型iOS/Android项目• 金融、银行类App(业务极其复杂)• 长期维护的核心产品

Leave a Reply

Your email address will not be published. Required fields are marked *

*