0111_设计模式说明

什么是设计模式

设计模式(Design Pattern)是软件设计中常见问题的典型解决方案。它们不是可以直接转换成代码的完整设计,而是解决特定问题的模板或描述,可以在多种不同情况下使用。

设计模式的主要特点:

  • 经过验证的解决方案:是众多软件开发人员经过长期试验和错误总结出来的经验
  • 通用可复用的方案:不针对特定问题,而是描述通用解决方案
  • 标准化术语:为开发者提供共享的词汇和共同的理解

一个设计模式有四个基本要素:

  • 模式名称 (Pattern Name)

    • 是什么:一个高度概括的、用来描述模式、其解决方案和意图的词汇。
    • 为什么重要
      • 建立词汇表:它为我们提供了一种通用的设计语言。开发者之间可以说“这里用个单例模式”而不是花十分钟描述“那个只能有一个实例的类,它的构造函数是私有的...”。
      • 提高抽象层级:名称帮助我们在更高的层面上思考和交流设计问题,而不用拘泥于具体的实现细节。
    • 例子:单例模式 (Singleton)、工厂方法模式 (Factory Method)、观察者模式 (Observer)、装饰器模式 (Decorator) 等。
  • 问题 (Problem)

    • 是什么:描述了模式应该在何种场景下应用,即它所要解决的设计问题以及存在的前提条件。
    • 包含内容
      • 意图:模式的目标是什么?
      • 场景:在什么情况下会遇到这个问题?(例如,需要创建的对象类型不确定,一个对象的变化需要通知多个其他对象等)
      • 动机:通过一个具体的设计问题来阐明模式的必要性。
    • 作用:帮助你判断当前面临的问题是否与模式所要解决的问题匹配,从而决定是否应该使用该模式。
    • 例子:(对于观察者模式)当一个对象的状态改变需要自动通知其他多个对象,但又希望它们之间保持松耦合时,就遇到了这个问题。
  • 解决方案 (Solution)

    • 是什么:对设计的抽象描述,提供了解决上述问题的一套通用设计模板。它不是指具体的代码,而是关于模式中元素(类、对象)的职责、协作关系和交互方式的说明。
    • 包含内容
      • UML 图:通常用一个类图或序列图来直观地展示模式中各个角色(类、接口)之间的静态结构和动态关系。
      • 组成元素:详细说明模式中每个参与者(如 Subject, Observer, ConcreteObserver)的职责。
      • 协作方式:描述这些参与者如何相互协作,消息如何传递。
    • 注意:解决方案是一种模板,可以根据具体上下文进行实现和调整,它不是一个一刀切的代码片段。
    • 例子:(对于观察者模式)解决方案是:定义一个 Subject(主题)来维护一组 Observer(观察者),并提供 attachdetach 方法。当 Subject 的状态改变时,调用所有观察者的 update 方法。
  • 效果 (Consequences)

    • 是什么:应用该模式所带来的结果、权衡和利弊的分析。
    • 包含内容
      • 优点:模式如何解决问题?它带来了哪些灵活性、可复用性、可维护性等方面的好处?(例如,降低了模块间的耦合度)
      • 缺点:使用模式的代价是什么?(例如,可能会引入额外的复杂性、降低性能、增加代码量等)
      • 权衡:在什么情况下利大于弊,什么情况下弊大于利?
    • 作用:这是决定是否采用一个模式的最关键因素。它让你能够权衡模式的优缺点,并根据你的具体需求(如性能要求、项目规模)做出明智的决策。
    • 例子:(对于单例模式)
      • 优点:提供了对唯一实例的受控访问,节省系统资源。
      • 缺点:违反了单一职责原则(因为它同时控制了创建和业务逻辑),难以进行单元测试(全局状态),在多线程环境下需要特殊处理。

常用的设计模式

设计模式通常分为三大类:

创建型模式 (Creational Patterns)

  1. 单例模式(Singleton) - 确保一个类只有一个实例,并提供全局访问点
  2. 工厂方法(Factory Method) - 定义一个创建对象的接口,但让子类决定实例化哪个类
  3. 抽象工厂(Abstract Factory) - 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
  4. 建造者模式(Builder) - 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
  5. 原型模式(Prototype) - 通过复制现有对象来创建新对象

结构型模式 (Structural Patterns)

  1. 适配器模式(Adapter) - 将一个类的接口转换成客户希望的另一个接口
  2. 装饰器模式(Decorator) - 动态地给一个对象添加一些额外的职责
  3. 代理模式(Proxy) - 为其他对象提供一种代理以控制对这个对象的访问
  4. 外观模式(Facade) - 为子系统中的一组接口提供一个一致的界面
  5. 桥接模式(Bridge) - 将抽象部分与实现部分分离,使它们可以独立变化
  6. 组合模式(Composite) - 将对象组合成树形结构以表示"部分-整体"的层次结构
  7. 享元模式(Flyweight) - 运用共享技术有效地支持大量细粒度的对象

行为型模式 (Behavioral Patterns)

  1. 策略模式(Strategy) - 定义一系列算法,把它们一个个封装起来,并且使它们可相互替换
  2. 观察者模式(Observer) - 定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知
  3. 命令模式(Command) - 将请求封装为对象,从而使你可用不同的请求对客户进行参数化
  4. 状态模式(State) - 允许对象在内部状态改变时改变它的行为
  5. 责任链模式(Chain of Responsibility) - 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求
  6. 模板方法(Template Method) - 定义一个操作中的算法骨架,而将一些步骤延迟到子类中
  7. 迭代器模式(Iterator) - 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
  8. 中介者模式(Mediator) - 用一个中介对象来封装一系列的对象交互
  9. 备忘录模式(Memento) - 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
  10. 访问者模式(Visitor) - 表示一个作用于某对象结构中的各元素的操作
  11. 解释器模式(Interpreter)- 给定一种语言,定义它的语法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子

其他模式

  • 委托模式 (Delegate)- 两个对象参与处理同一个请求,接收请求的对象将请求委托给另一个对象来处理

推荐书籍

  1. 《Head First 设计模式》

    • 作者:Eric Freeman, Elisabeth Robson
    • 以轻松有趣的方式讲解设计模式,适合初学者
  2. 《大话设计模式》

    • 作者:程杰
    • 本书通篇都是以情景对话的形式,用多个小故事或编程示例来组织讲解GOF。 本书适合编程初学者或希望在面向对象编程上有所提高的开发人员阅读。
  3. 《设计模式:可复用面向对象软件的基础》(GoF书)

    • 作者:Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
    • 设计模式的经典之作,23种设计模式的起源
  4. 《重构:改善既有代码的设计》

    • 作者:Martin Fowler
    • 虽然不是专门讲设计模式,但展示了如何通过重构引入设计模式

选择书籍时,建议根据你的编程语言和水平来选择。初学者可以从《Head First设计模式》开始,有一定基础后再阅读GoF的经典著作。

posted @ 2025-08-26 08:15  庞去广  阅读(14)  评论(0)    收藏  举报