Skip to content

程序设计模式(Design Patterns)是软件开发中针对常见问题的可复用解决方案。它们不是具体的代码实现,而是经过验证的最佳实践模板 ,帮助开发者提升代码的可维护性复用性扩展性。以下是设计模式的核心分类与典型示例:


一、三大基础分类

  1. 创建型模式(Creational Patterns)

    • 核心目标:优化对象创建逻辑。
    • 典型模式
      • 单例模式(Singleton):确保一个类仅有一个实例(如全局配置对象)。
      • 工厂方法(Factory Method):通过子类决定实例化哪个类(如支付接口的多渠道实现)。
      • 抽象工厂(Abstract Factory):创建相关对象族(如跨平台的UI组件库)。
      • 建造者模式(Builder):分步构建复杂对象(如生成多格式文档)。
  2. 结构型模式(Structural Patterns)

    • 核心目标:设计对象间的协作关系。
    • 典型模式
      • 适配器模式(Adapter):兼容不兼容接口(如旧系统对接新API)。
      • 装饰器模式(Decorator):动态添加功能(如带缓存和日志的数据库访问层)。
      • 代理模式(Proxy):控制对象访问(如惰性加载大文件)。
      • 组合模式(Composite):树状结构处理(如UI组件嵌套)。
  3. 行为型模式(Behavioral Patterns)

    • 核心目标:优化对象间的通信流程。
    • 典型模式
      • 观察者模式(Observer):事件驱动响应(如实时数据仪表盘更新)。
      • 策略模式(Strategy):动态切换算法(如不同排序策略的运行时选择)。
      • 责任链模式(Chain of Responsibility):请求传递链(如多层权限校验)。
      • 模板方法(Template Method):定义算法骨架(如电商订单处理流程)。

二、典型案例解析

观察者模式(Observer)

  • 场景:天气预报系统需要实时通知多个显示终端。
  • 实现
    python
    class WeatherStation:
        def __init__(self):
            self._observers = []
            self._temperature = 0
        
        def add_observer(self, observer):
            self._observers.append(observer)
        
        def set_temperature(self, temp):
            self._temperature = temp
            self._notify_observers()
        
        def _notify_observers(self):
            for observer in self._observers:
                observer.update(self._temperature)
    
    class Display:
        def update(self, temp):
            print(f"当前温度: {temp}℃")
    
    # 使用
    station = WeatherStation()
    phone_display = Display()
    station.add_observer(phone_display)
    station.set_temperature(25)  # 自动触发所有显示器更新

三、设计模式的核心价值

  1. 降低耦合度:例如通过依赖注入解耦模块。
  2. 提升扩展性:如策略模式允许新增算法无需修改主逻辑。
  3. 增强代码可读性:标准化的模式命名促进团队协作。
  4. 避免重复造轮子:复用经过验证的解决方案。

四、学习路径建议

  1. 经典书籍:《设计模式:可复用面向对象软件的基础》(GoF)
  2. 实践方法:在重构现有代码时识别模式应用场景
  3. 进阶方向:结合领域驱动设计(DDD)理解模式在复杂系统中的应用

注意:避免模式滥用。简单的需求直接编码,复杂问题再引入模式。例如:小型工具类无需工厂模式,直接new实例更高效。

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer