设计模式
外观
设计模式是软件工程中针对常见问题的可重用解决方案,它描述了在特定环境下解决特定设计问题的类与对象之间的交互关系。设计模式不是可以直接转化为代码的完整设计,而是解决特定问题的模板或指南。
历史与发展[编辑 | 编辑源代码]
设计模式的概念最早由建筑师克里斯托弗·亚历山大提出,后由四人帮(Gang of Four,GoF)在1994年的著作《设计模式:可复用面向对象软件的基础》中引入计算机科学领域。该书系统性地描述了23种经典设计模式。
模式分类[编辑 | 编辑源代码]
设计模式通常分为三大类:
创建型模式[编辑 | 编辑源代码]
处理对象创建机制:
结构型模式[编辑 | 编辑源代码]
处理类或对象的组合:
- 适配器模式:使接口不兼容的类能一起工作
- 装饰器模式:动态添加职责
- 代理模式:为其他对象提供代理
- 组合模式:将对象组合成树形结构
- 外观模式:提供统一接口
- 享元模式:高效共享大量细粒度对象
- 桥接模式:分离抽象与实现
行为型模式[编辑 | 编辑源代码]
处理对象间的通信:
- 观察者模式:定义对象间一对多依赖
- 策略模式:封装算法族
- 命令模式:将请求封装为对象
- 状态模式:允许对象在状态改变时改变行为
- 责任链模式:将请求沿处理链传递
- 访问者模式:在不改变类的前提下定义新操作
- 迭代器模式:顺序访问聚合对象元素
- 中介者模式:减少对象间直接引用
- 备忘录模式:捕获并恢复对象状态
- 模板方法:定义算法骨架
- 解释器模式:定义语言的文法表示
代码示例[编辑 | 编辑源代码]
以下是单例模式的Python实现示例:
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
# 使用示例
s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # 输出: True
设计原则[编辑 | 编辑源代码]
设计模式通常遵循以下面向对象设计原则:
- 单一职责原则(SRP):一个类只应有一个改变的理由
- 开闭原则(OCP):对扩展开放,对修改关闭
- 里氏替换原则(LSP):子类应能替换父类
- 接口隔离原则(ISP):多个专用接口优于单一通用接口
- 依赖倒置原则(DIP):依赖抽象而非具体实现
应用场景[编辑 | 编辑源代码]
设计模式在以下场景特别有用:
- 需要提高代码复用性时
- 系统需要保持灵活性时
- 需要提高代码可维护性时
- 团队协作开发时提供共同语言
模式关系图[编辑 | 编辑源代码]
数学表示[编辑 | 编辑源代码]
某些模式可以用数学表达,如观察者模式的订阅关系可表示为: 其中S是主题,O是观察者集合。
反模式[编辑 | 编辑源代码]
与设计模式相对的是反模式,即常见但效果不佳的解决方案,例如:
现代发展[编辑 | 编辑源代码]
随着编程范式的发展,出现了新的模式类别:
学习建议[编辑 | 编辑源代码]
掌握设计模式的建议路径: 1. 理解面向对象基础 2. 学习SOLID原则 3. 从简单模式(如策略、观察者)开始 4. 在实际项目中应用 5. 研究框架源码中的模式应用