设计模式:可复用的面向对象

简介

  • 底层思维(向下)

    • 语言构造
    • 编译转换
    • 内存模型
    • 运行时机制
  • 抽象思维(向上)

    • 面向对象
    • 组件封装
    • 设计模式
    • 架构模式
  • 面向对象

    • 机制:
      • 封装,隐藏内部实现
      • 继承,复用现有的代码
      • 多态,改写对象行为
    • 构建可复用的对象
  • 软件设计复杂的根本原因

    • 变化
  • 如何解决复杂性

    • 分解

      分而治之,把复杂的问题分解为多个简单的问题,例如:C

    • 抽象

      忽略非本质的细节,处理泛化和理想化的对象模型

  • 软件设计的目标

    复用


面向对象设计原则

  • 面向对象

    • 隔离变化
      • 变化影响最小
    • 各司其职
      • 接口一样,实现不同
    • 对象是什么
      • 封装了代码和数据
      • 规格上,对象是一系列可被使用的接口
      • 概念上,某种拥有责任的抽象
  • 设计原则

    • 依赖倒置原则(DIP)

      • 高层模块(稳定)不应该依赖低层模块(变化),二者都应该依赖于抽象

      • 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象

    • 开放封闭原则(OCP)

      • 对扩展开放,对更改封闭
      • 类模块应该是可扩展的,但是不可修改的
    • 单一职责原则(SRP)

      • 一个类应该仅有一个引起它变化的原因
      • 变化的方向隐含着类的责任
    • Liskov替换原则(LSP)

      • 子类必须能够替换它们的基类
      • 继承表达类型抽象
    • 接口隔离原则(ISP)

      • 不应该强迫客户程序依赖它们不用的方法
      • 接口应该小而完备
    • 优先使用对象组合,而不是类继承

      • 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
      • 继承在某种程度上破坏了封装性,子类父类耦合度高
      • 对象组合则之要求被组合的对象具有良好定义的接口,耦合度是低的
    • 封装变化点

      • 使用封装创建对象之间的分界层,让设计者在一侧修改,对另一侧没有影响
    • 针对接口编程,而不是针对实现编程

      • 不将变量设计为特定的类型,而是一个接口,使用通用的方法
      • 客户程序不需要知道具体类型,只需要知道对象接口
      • 减少依赖,实现高内聚,低耦合的设计
  • 面向接口设计

    • 接口标准化
  • 将设计原则提升为设计经验

    • 设计习语
    • 设计模式
    • 架构模式

模板方法

  • 模式分类

    • 目的
    • 创建型模式
    • 结构型模式
    • 行为型模式
    • 范围
    • 类模式处理类与子类的静态关系
    • 对象模式处理对象之间动态关系
    • 封装变化角度分类

    待补充

  • 重构获得模式

    • 寻找变化点,并在变化点处应用设计模式,明白应用的时候
    • 没有一步到位的设计模式 《敏捷开发之道》,《重构与模式》
  • 重构的关键技法

    • 静态->动态
    • 早绑定->晚绑定
    • 继承->组合
    • 编译时依赖->运行时依赖
    • 紧耦合->松耦合
  • 组建协作模式

    • 晚绑定,实现组件的松耦合

      • Template Method

        早绑定与晚绑定

        • 晚绑定 早的东西调用晚的东西

        定义一个操作中的算法结构(稳定),而将一些步骤延迟(变化)到子类中,但是子类可以定义其中一些方法,不改变原本的算法结构

        稳定中有变化

        template_method_.h

      • Strategy

      • Observer/Event