~/app/articles/NORMAL

cat article/41.md

面向对象的23种设计模式

学习笔记
面向对象设计模式
Gang of Four
设计模式
软件设计
编程模式

本文介绍了面向对象设计模式中的23种经典模式,包括创建型模式、结构型模式等,并对其进行了分类和简要说明,适合于学习编程和软件设计的人员阅读。

面向对象设计模式是解决软件设计中常见问题的可复用方案,通常由 Gang of Four (GoF) 在《设计模式:可复用面向对象软件的基础》中提出的23种经典模式。以下是分类和简介:


一、创建型模式(5种)

关注对象的创建机制,降低对象创建的耦合性。

  1. 单例模式 (Singleton)

    • 确保一个类只有一个实例,并提供全局访问点。
    • 示例:数据库连接池、日志管理器。
  2. 工厂方法模式 (Factory Method)

    • 定义创建对象的接口,但由子类决定实例化的类。
    • 示例:日志记录器(文件/数据库日志)。
  3. 抽象工厂模式 (Abstract Factory)

    • 创建相关或依赖对象的家族,无需指定具体类。
    • 示例:跨平台UI组件(Windows/Mac按钮)。
  4. 建造者模式 (Builder)

    • 分步骤构建复杂对象,分离构造与表示。
    • 示例:SQL查询构造器、快餐套餐组合。
  5. 原型模式 (Prototype)

    • 通过复制现有对象来创建新对象。
    • 示例:Java的Cloneable接口。

二、结构型模式(7种)

处理类或对象的组合,形成更大结构。 6. 适配器模式 (Adapter)

  • 转换接口使得不兼容的类可以协作。
  • 示例:旧版API适配新系统。
  1. 桥接模式 (Bridge)

    • 分离抽象与实现,使两者独立变化。
    • 示例:不同形状和颜色的图形绘制。
  2. 组合模式 (Composite)

    • 将对象组合成树形结构以表示“部分-整体”层次。
    • 示例:文件系统(文件/文件夹)。
  3. 装饰器模式 (Decorator)

    • 动态添加职责到对象,替代继承。
    • 示例:Java I/O流(BufferedInputStream)。
  4. 外观模式 (Facade)

    • 提供简化复杂子系统的统一接口。
    • 示例:一键启动电脑(封装CPU、内存等操作)。
  5. 享元模式 (Flyweight)

    • 共享细粒度对象以减少内存使用。
    • 示例:字符池(重复利用字母对象)。
  6. 代理模式 (Proxy)

    • 为其他对象提供代理以控制访问。
    • 示例:虚拟代理(延迟加载大图)、远程代理(RPC)。

三、行为型模式(11种)

关注对象间的通信和职责分配。 13. 职责链模式 (Chain of Responsibility)
- 将请求沿处理链传递,直到有对象处理它。
- 示例:审批流程(经理→总监→CEO)。

  1. 命令模式 (Command)

    • 将请求封装为对象,支持撤销/排队。
    • 示例:GUI按钮操作、事务管理。
  2. 解释器模式 (Interpreter)

    • 定义语言的语法表示,并解释执行。
    • 示例:正则表达式解析。
  3. 迭代器模式 (Iterator)

    • 提供顺序访问聚合对象元素的方法。
    • 示例:Java的Iterator接口。
  4. 中介者模式 (Mediator)

    • 通过中介对象减少对象间直接耦合。
    • 示例:聊天室(用户不直接通信)。
  5. 备忘录模式 (Memento)

    • 捕获并外部化对象状态以支持撤销。
    • 示例:游戏存档。
  6. 观察者模式 (Observer)

    • 定义对象间的一对多依赖,状态变更时自动通知。
    • 示例:事件监听、消息订阅。
  7. 状态模式 (State)

    • 允许对象在内部状态改变时改变行为。
    • 示例:订单状态(待支付/已发货)。
  8. 策略模式 (Strategy)

    • 定义算法族,使其可互换。
    • 示例:排序算法(快速排序/冒泡排序)。
  9. 模板方法模式 (Template Method)

    • 定义算法骨架,子类重写特定步骤。
    • 示例:冲泡饮料(咖啡/茶流程)。
  10. 访问者模式 (Visitor)

    • 将算法与对象结构分离,便于新增操作。
    • 示例:文件系统遍历(统计大小/查找文件)。

核心思想

  • 解耦:减少组件间的依赖(如工厂模式、中介者模式)。
  • 复用:通过组合而非继承(如装饰器、策略模式)。
  • 扩展性:开闭原则(如观察者、访问者模式)。

每种模式需结合具体场景选择,避免过度设计。

$ comments --list (0)

// not signed in


// no comments yet