《深入设计模式》阅读笔记

122 阅读5分钟

面向对象程序设计简介

面向对象程序设计 (Object-Ori­ent­ed Pro­gram­ming, 缩写为 OOP) 是一种范式, 其基本理念是将数据块及与数据相关的行为封装成为特殊的、 名为对象的实体, 同时对象实体的生成工作则是基于程序员给出的一系列 “蓝图”, 这些 “蓝图” 就是类。


摘录来自: 亚历山大 · 什韦茨. “深入设计模式。”

对象和类

image.png

image.png

  • 成员变量
  • 方法

类层次结构

  • 超类
  • 子类

image.png

image.png

面向对象程序设计基础

image.png

  • 抽象
  • 封装
  • 集成
  • 多态

对象之间的关系

image.png

image.png

  • 依赖
  • 关联
  • 聚合
  • 组合
  • 实现
  • 继承

设计模式简介

什么是设计模式?

  • 设计模式是软件设计中常见问题的典型解决方案。
  • 模式并不是一段特定的代码, 而是解决特定问题的一般性概念。

模式VS算法

  • 人们常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案
  • 算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。 同一模式在两个不同程序中的实现代码可能会不一样。
  • 算法更像是菜谱: 提供达成目标的明确步骤。
  • 而模式更像是蓝图: 你可以看到最终的结果和模式的功能, 但需要自己确定实现步骤。

模式包含哪些内容?

  • 意图(部分简要地描述问题和解决方案)
  • 动机(部分进一步解释问题并说明模式会如何提供解决方案)
  • 结构(部分展示模式的各个部分和它们之间的关系)
  • 在不同语言中的实现(提供流行编程语言的代码, 让读者更好地理解模式背后的思想)

模式的分类

  1. 最基础的、 底层的模式通常被称为惯用技巧。 这类模式一般只能在一种编程语言中使用。
  2. 最通用的、 高层的模式是架构模式。 开发者可以在任何编程语言中使用这类模式。 与其他模式不同, 它们可用于整个应用程序的架构设计。
  • 创建型模式
  • 结构型模式
  • 行为模式

为什么以及如何学习设计模式?

  • 设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。
  • 设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。

软件设计原则

优秀设计的特征

  • 代码复用
  • 扩展性

设计原则

  • 封装变化的内容

    • 方法层面的封装
    • 类层面的封装
  • 面向接口进行开发,而不是面向实现

面向接口进行开发, 而不是面向实现; 依赖于抽象类型, 而不是具体类。

  • 组合由于继承

继承导致的问题清单

  • 子类不能减少超类的接口
  • 在重写方法时, 你需要确保新行为与其基类中的版本兼容
  • 继承打破了超类的封装
  • 子类与超类紧密耦合
  • 通过继承复用代码可能导致平行继承体系的产生

组合是代替继承的一种方法。 继承代表类之间的 “是” 关系 (汽车是交通工具), 而组合则代表 “有” 关系 (汽车有一个引擎)。

典型例子:汽车制造

image.png

image.png

  • SOLID原则

SOLID 是让软件设计更易于理解、 更加灵活和更易于维护的五个原则的简称

  • S(单一职责原则)ingle Respon­si­bil­i­ty Prin­ci­ple

    • 修改一个类的原因只能有一个。
    • 尽量让每个类只负责软件中的一个功能, 并将该功能完全封装 (你也可称之为隐藏) 在该类中。
  • O(开闭原则)pen/closed Prin­ci­ple

    • 对于扩展, 类应该是 “开放” 的; 对于修改, 类则应是 “封闭” 的。
    • 主要理念是在实现新功能时能保持已有代码不变。
  • L (里氏替换原则)iskov Sub­sti­tu­tion Prin­ci­ple 

    • 当你扩展一个类时, 记住你应该要能在不修改客户端代码的情况下将子类的对象作为父类对象进行传递。
    • 子类必须保持与父类行为的兼容。 在重写一个方法时, 你要对基类行为进行扩展, 而不是将其完全替换。
  • I(接口隔离原则)nter­face Seg­re­ga­tion Prin­ci­ple

    • 客户端不应被强迫依赖于其不使用的方法。
    • 尽量缩小接口的范围, 使得客户端的类不必实现其不需要的行为
  • D(依赖倒置原则)epen­den­cy Inver­sion Prin­ci­ple

    • 高层次的类不应该依赖于低层次的类。 两者都应该依赖于抽象接口。
    • 抽象接口不应依赖于具体实现。
    • 具体实现应该依赖于抽象接口。

设计模式目录

创建型模式

  • 工厂方法(Factory Method)
  • 抽象工厂(Abstract Factory)
  • 生成器 (Builder)
  • 原型 (Prototype)
  • 单列(Singleton)

结构性模式

  • 适配器(Adapter)
  • 桥接(Bridge)
  • 组合(Composite)
  • 装饰(Decotor)
  • 外观(Facad)
  • 亨元(Flyweight)
  • 代理(Proxy)

行为模式

  • 责任链(Chain of Responsibility)
  • 命令(Command)
  • 中介者(Mediator)
  • 迭代器(Iterator)
  • 备忘录(Memento)
  • 观察者(Observe)
  • 策略(Strategy)
  • 状态(State)
  • 模板(Template Method)
  • 访问者(Visitor)

模式速查表

designpatternscard1_waifu2x_photo_noise3_scale.jpg

designpatternscard2_waifu2x_photo_noise3_scale.jpg