设计模式概述

1. 起源

每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次重用那些已有的成功的解决方案,无须再重复相同的工作。

软件模式(Software Patterns)是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式

想要学习设计模式的原因,是因为感到自己的代码能力还是有点捉急,可以写出能用的代码,但很难写出好看的代码,如果每次写代码的时候都要一行一行的来构建,而没有一个组件一个组件的意识的话,那写好代码恐怕只能是天方夜谭了。我想设计模式对我来说,就是抽象,构建框架的过程,是真真切切能够在日常工作当中帮助到自己的。不仅仅在于代码质量,也在于组件化以后的开发速度,以及对于更加复杂的商业上的实际场景得以提供出更加匹配的解决方式的能力。

另外一个点是当前我的能力范畴还是仅仅在于根据需求写出代码,即停留在写业务代码的阶段,在这个阶段当中,自己并不需要具有很强的代码设计能力,理解业务就可以写出代码了。但是如果想要成长,还是需要具备写出和业务并不直接相关的更加通用的功能模块的能力的。

2. 软件模式的基础结构

  • 问题描述
  • 前提条件
  • 解法
  • 效果

2.1 评价代码的一些维度

关于如何判断一段代码写的好坏,众说纷纭,每个人其实都有自己主观上的某些看法。但是在更高维度上来说,会有一些相对能达成共识的标准,是我们可以在平常写代码的时候更多的注意一下的。

2.1.1 可维护性 maintainability

  • 在不破坏原有代码的设计,不引入新的bug的情况下,能够快速地修改或者添加代码
  • 细拆分其实就有很多因素的协同作用了
    • 代码的可读性,简洁
    • 代码分层清晰程度,模块化,高内聚低耦合
    • 基于接口而非实现编程

2.1.2 可读性 readability

  • 命名
  • 注释
  • 函数的长短
  • 模块的划分

2.1.3 可扩展性 extensibility

表征的是我们的代码对未来需求变化进行应对的能力。

即代码预留了一些功能的扩展点,我们可以将新功能代码直接插入到扩展点上,而不需要因为添加一个功能而大动干戈,改动大量的原始代码。

2.1.4 灵活性 flexibility

  • 比如预留好了扩展点给新的功能代码来使用
  • 代码已经抽象出了很多底层可以复用的模块,类

2.1.5 简洁性 simplicity

Keep it simple, stupid.

2.1.6 可复用性 reusability

尽量减少重复代码的编写,复用已有的代码

2.1.7 可测试性 testability

比较难写的单元测试往往意味着代码的设计是有问题的。

如果说上面的细节实在是太多,并不能一下子很快的掌握,个人感觉,去看别人的设计,别人的代码,和自己的比较,会是非常快的成长方式。除此以外,肯定还是要经过看山是山,不是山,还是山的阶段的。希望自己的代码最终能像一个故事一样,将一段逻辑讲述完整。

3. 设计模式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

整个设计模式系列将会分以下几个部分:

  1. 概述

  2. 面向对象设计原则

    • 单一职责
    • 开闭原则
    • 里氏代换
    • 依赖倒转
    • 接口隔离
    • 合成复用
    • 迪米特
  3. 创建型模式(描述如何创建对象)

    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
    • 单例模式
    • 原型模式
    • 建造者模式
  4. 结构型模式(如何实现类或对象的组合)

    • 适配器模式
    • 桥接模式
    • 组合模式
    • 装饰模式
    • 外观模式
    • 享元模式
    • 代理模式
  5. 行为型模式(类或者对象怎样交互以及怎样分配职责)(类是对一类事物的描述,抽象出来的;而对象是具体的描述。类是一群具有相同属性的对象的集合体)

    • 职责链模式
    • 命令模式
    • 解释器模式
    • 迭代器模式
    • 中介者模式
    • 备忘录模式
    • 观察者模式
    • 状态模式
    • 策略模式
    • 模板方法模式
    • 访问者模式

4. 面向对象,设计原则,设计模式,编程规范,代码重构

4.1 面向对象

主流的编程范式有:

  • 面向过程
  • 面向对象
  • 函数式编程

面向对象因为其具有的丰富的特性 - 封装,继承,抽象,多态。可以实现很多复杂的设计思路,是很多设计原则,设计模式的实现基础。

  • 知识点
    • 封装 继承 抽象 多态
    • 面向对象与面向过程编程的区别与联系
    • 面向对象的分析设计和编程
    • 接口和抽象类的区别以及各自的应用场景
    • 基于接口而非实现的编程设计思想
    • 多用组合少用继承的设计思想
    • 面向过程的贫血模型和面向对象的充血模型

      4.2 设计原则

  • 设计原则
    • 单一职责原则
    • 开闭原则
    • 里氏替换原则
    • 接口隔离原则
    • 依赖导致原则
    • DRY
    • KISS
    • YAGNI
    • LOD

4.3 设计模式

  • 设计模式
    • 为了解决代码的可扩展性问题
    • 需要掌握他们都解决了哪些问题,典型的应用场景,并且不能也不应该过度使用
    • 创建型
      • 单例模式
      • 工厂模式
      • 建造者模式
    • 结构型
      • 代理模式
      • 桥接模式
      • 装饰者模式
      • 适配器模式
    • 行为型
      • 观察者模式
      • 模板模式
      • 策略模式
      • 职责链模式
      • 迭代器模式
      • 状态模式

4.4 编程规范

主要为了解决代码的可读性问题,这些规范主要是记忆,熟悉,然后尽量多的去使用。书籍的话可以去看重构,代码大全,代码整洁之道这几本书。

4.5 代码重构

业务发展,规模扩大,原先的设计很可能无法支持现在的体量的应用场景,这种情况下就需要持续重构了。而是用的工具就是我们前面说的设计模式,编程规范等等。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com

文章标题:设计模式概述

文章字数:1.9k

本文作者:Leilei Chen

发布时间:2020-02-21, 14:58:10

最后更新:2020-02-23, 09:10:22

原始链接:https://www.llchen60.com/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%BF%B0/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏