【索引】高质量代码与设计模式
本文所有未进行有效链接的站内文章其实已经基本写好了,待进一步润色之后会陆续上线。
编程范式与编程风格
常见的编程范式/编程风格:
- 面向过程编程:以函数作为组织代码的单元,数据与方法相分离。
- 站内文章面向对象编程 OOP:以类、对象作为组织代码的单元以及它的四大特性。
- 站内文章面向切面编程 AOP:将横切关注点从核心业务逻辑中分离出来,形成切面。
- 站内文章函数式编程 Functional Programming:程序可以用一系列数学函数或表达式的组合来表示。
不同的编程范式之间并不是截然不同的,总是有一些相同的编程规则。比如,不管是面向过程、面向对象还是函数式编程,它们都有变量、函数的概念,最顶层都要有 main 函数执行入口,来组装编程单元(类、函数等)。只不过,面向对象的编程单元是类或对象,面向过程的编程单元是函数,函数式编程的编程单元是无状态函数。
设计原则
站内文章设计原则 文章中介绍 SOLID 等代码编写和设计原则。
设计模式
设计模式是指针对软件开发过程中重复发生的问题的解决方法。其中以被称为 Gang of Four 整理出的 23 种设计模式最为有名。除此以外还有其他设计模式,参考:
设计模式不是万能的,我们需要明确知道自己的软件中存在什么样的问题,明确设计模式可以解决什么问题,才能选出合适的设计模式。设计模式重要性在于快速掌握经验丰富的开发人员才具有的知识和经验,但也没必要机械地背下来。
GoF 23 经典的设计模式及延伸
上世纪 90 年代,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合作出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一书,中文译名为《设计模式 - 可复用的面向对象软件元素》。该书首次提到了软件开发中设计模式的概念,并收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑。
四位作者合称 GoF(四人组,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下面向对象设计原则:
- 对接口编程而不是对实现编程。
- 优先使用对象组合而不是继承。
因此,书中提到的 23 中设计模式,也称为经典的「GoF 设计模式」。
模式分类
本科时期我的简记
- 创建型:建造单例原型工厂
- 结构型:ABCompositeDFP(不包含创建型),
250830
或「想焖主包」(享门组包 Wrapper)。 - 行为型:剩下的都是行为型。
创建型:解决对象创建的问题
- 站内文章单例模式:文章讲解多种单例模式写法。单例模式应用可看此文:站内文章单例模式的应用——为 Java 程序应用全局配置
- 站内文章工厂模式:文章讲解并区分多种工厂模式的写法,含抽象工厂、工厂方法模式。
- 站内文章建造者模式:文章讲解两种建造者模式的写法。
- 站内文章原型模式:文章附带讲解深浅拷贝、Java 中
clone
的使用。
创建型模式 | 创建类的特点 |
---|---|
单例模式 | 创建全局唯一的对象 |
工厂模式 | 创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。 |
建造者模式 | 创建复杂对象,可以通过设置不同的可选参数,「定制化」地创建不同的对象 |
原型模式 | 创建成本比较大的对象,利用对已有对象进行复制的方式进行创建,以达到节省创建时间的目的。 |
结构型:一些类或对象组合在一起的经典结构
- Wrapper 模式
- 站内文章适配器模式:转接头:文章介绍两种适配器模式实现方式以及 Wrapper 模式的对比。
- 站内文章桥接模式:文章介绍类的两个层次结构引出桥接模式。
- 站内文章装饰器模式:相框:文章后讨论了组合和继承的运用。
- 站内文章代理模式:爱因斯坦和他的司机:文章介绍了动态代理和静态代理。
- 站内文章组合模式:树形结构:它更像是一种数据的形式。
- 站内文章门面模式:点击即用:它把分散的对象又耦合了起来。
- 站内文章享元模式:共享实例:文章附带介绍 Java 中享元模式的应用。
行为型:类和对象之间的交互
- 站内文章观察者模式:订阅与推送:文章还讲解了异步非阻塞的实现方法。
- 站内文章模板方法模式:文章另外介绍了回调以及 Java 函数式编程方法。
- 站内文章策略模式:符文槽:文章用案例一步步引入策略模式。
- 站内文章责任链模式:文章讲解责任链的构造、关键代码技巧以及两种变体。
- 站内文章迭代器模式:游标:文章另外讲解了 Java 中的迭代器以及改变集合所导致的未决行为的解决方案。
- 站内文章中介者模式:只有一个仲裁者:中介者模式其实是观察者模式的集中处理升级版。
- 站内文章命令模式:它将命令当成类。
- 站内文章解释器模式:它将语法结构当成类。
- 站内文章备忘录模式:拍下照片:它将状态保存为实例。
- 站内文章状态模式:文章通过 FSM 的实现方式引入对状态模式的介绍。
- 站内文章访问者模式:文章探讨了访问者模式的诞生于双分派机制。
设计模式之间的区别
23 种设计模式可进一步划分为创建型、组合型和行为型设计模式。
每个设计模式都应该由两部分组成:第一部分是应用场景,即这个模式可以解决哪类问题;第二部分是解决方案,即这个模式的设计思路和具体的代码实现。如果只观察设计模式的代码实现,你会发现一些模式是十分相似的:
但设计模式之间的主要区别还是在于设计意图,即应用场景。对于某些模式之前的相似性比较,相关设计模式文章中会有所涉及。
「用类/示例来表示 XXX」的模式
在面向对象编程中,是用类表示对象的。也就是说,程序的设计者需要考虑用类来表示什么东西。类对应的东西可能存在于真实世界中,也可能不存在于真实世界中。对于后者,可能有人看到代码后会感到吃惊:这些东西居然也可以是类啊。
「用类/示例来表示 XXX」的模式均为行为型设计模式:
多线程的设计模式
上面 GoF 23 个经典设计模式中部分模式也有多线程的实现,如:
此外,一些和多线程有关的设计模式有:
- 站内文章不变模式:文章也介绍了 Java 的不可变类。
- 站内文章同步模式——顺序控制
- 站内文章同步模式——交替输出
本文参考
- 《图解设计模式》【日】结城浩著,杨文轩译,中国工信出版集团,人民邮电出版社
- 《Java 面向对象编程》孙卫琴
- 极客时间专栏 - 设计模式之美 - 王争
- 设计模式简介 | 菜鸟教程 (runoob.com)
- 免费在线学习代码重构和设计模式