面向对象的23种设计模式
学习笔记
面向对象设计模式
Gang of Four
设计模式
软件设计
编程模式
本文介绍了面向对象设计模式中的23种经典模式,包括创建型模式、结构型模式等,并对其进行了分类和简要说明,适合于学习编程和软件设计的人员阅读。
面向对象设计模式是解决软件设计中常见问题的可复用方案,通常由 Gang of Four (GoF) 在《设计模式:可复用面向对象软件的基础》中提出的23种经典模式。以下是分类和简介:
一、创建型模式(5种)
关注对象的创建机制,降低对象创建的耦合性。
-
单例模式 (Singleton)
- 确保一个类只有一个实例,并提供全局访问点。
- 示例:数据库连接池、日志管理器。
-
工厂方法模式 (Factory Method)
- 定义创建对象的接口,但由子类决定实例化的类。
- 示例:日志记录器(文件/数据库日志)。
-
抽象工厂模式 (Abstract Factory)
- 创建相关或依赖对象的家族,无需指定具体类。
- 示例:跨平台UI组件(Windows/Mac按钮)。
-
建造者模式 (Builder)
- 分步骤构建复杂对象,分离构造与表示。
- 示例:SQL查询构造器、快餐套餐组合。
-
原型模式 (Prototype)
- 通过复制现有对象来创建新对象。
- 示例:Java的
Cloneable接口。
二、结构型模式(7种)
处理类或对象的组合,形成更大结构。 6. 适配器模式 (Adapter)
- 转换接口使得不兼容的类可以协作。
- 示例:旧版API适配新系统。
-
桥接模式 (Bridge)
- 分离抽象与实现,使两者独立变化。
- 示例:不同形状和颜色的图形绘制。
-
组合模式 (Composite)
- 将对象组合成树形结构以表示“部分-整体”层次。
- 示例:文件系统(文件/文件夹)。
-
装饰器模式 (Decorator)
- 动态添加职责到对象,替代继承。
- 示例:Java I/O流(
BufferedInputStream)。
-
外观模式 (Facade)
- 提供简化复杂子系统的统一接口。
- 示例:一键启动电脑(封装CPU、内存等操作)。
-
享元模式 (Flyweight)
- 共享细粒度对象以减少内存使用。
- 示例:字符池(重复利用字母对象)。
-
代理模式 (Proxy)
- 为其他对象提供代理以控制访问。
- 示例:虚拟代理(延迟加载大图)、远程代理(RPC)。
三、行为型模式(11种)
关注对象间的通信和职责分配。
13. 职责链模式 (Chain of Responsibility)
- 将请求沿处理链传递,直到有对象处理它。
- 示例:审批流程(经理→总监→CEO)。
-
命令模式 (Command)
- 将请求封装为对象,支持撤销/排队。
- 示例:GUI按钮操作、事务管理。
-
解释器模式 (Interpreter)
- 定义语言的语法表示,并解释执行。
- 示例:正则表达式解析。
-
迭代器模式 (Iterator)
- 提供顺序访问聚合对象元素的方法。
- 示例:Java的
Iterator接口。
-
中介者模式 (Mediator)
- 通过中介对象减少对象间直接耦合。
- 示例:聊天室(用户不直接通信)。
-
备忘录模式 (Memento)
- 捕获并外部化对象状态以支持撤销。
- 示例:游戏存档。
-
观察者模式 (Observer)
- 定义对象间的一对多依赖,状态变更时自动通知。
- 示例:事件监听、消息订阅。
-
状态模式 (State)
- 允许对象在内部状态改变时改变行为。
- 示例:订单状态(待支付/已发货)。
-
策略模式 (Strategy)
- 定义算法族,使其可互换。
- 示例:排序算法(快速排序/冒泡排序)。
-
模板方法模式 (Template Method)
- 定义算法骨架,子类重写特定步骤。
- 示例:冲泡饮料(咖啡/茶流程)。
-
访问者模式 (Visitor)
- 将算法与对象结构分离,便于新增操作。
- 示例:文件系统遍历(统计大小/查找文件)。
核心思想
- 解耦:减少组件间的依赖(如工厂模式、中介者模式)。
- 复用:通过组合而非继承(如装饰器、策略模式)。
- 扩展性:开闭原则(如观察者、访问者模式)。
每种模式需结合具体场景选择,避免过度设计。