前言
前段时间,跟着Gang of Four
学习了设计模式,虽然23种设计模式都过了一遍,好像懂了但是好像又有些不明白
。刚好在软考备考时设计模式也是考点。故此,通过这一次的再复习索性整理出设计模式的一套学习笔记,笔记中会通过生活中的例子详细讲解各种常用模式,并利用Java代码实现。
本文主要通过以下几点来对设计模式进行总结:
- 设计模式的背景
- 设计模式的概念
- 设计模式的的7大原则
- 设计模式的的4大要素
- 常见的23种设计模式
设计模式的背景
设计模式
这个术语最初并不是出现在软件设计中,而是被用于建筑领域
的设计中。
直到1990年
,软件工程界才开始研讨设计模式
的话题,后来召开了多次关于设计模式的研讨会。
在 1994年
,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides
四人合作出版了《设计模式:可复用面向对象软件的基础》
(Design Patterns - Elements of Reusable Object-Oriented Software) 一书,该书首次
提到了软件开发中设计模式的概念,并收录了23种设计模式。
设计模式的概念
首先初次接触设计模式的同学一定要牢记
设计模式不是某种语言,不是某种框架,更不是什么架构模式,它只是前辈们爬了无数坑、秃了头总结出来的代码设计经验!!!
其概念如下:
软件设计模式(Software Design Pattern),又称设计模式
,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案
。也就是说,它是解决特定问题的一系列套路
,是前辈们的代码设计经验的总结,具有一定的普遍性
,可以反复使用
。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
简单概括可得出如下要点:
- 代码设计经验的总结
- 通用解决方案
- 解决问题的套路
- 反复使用
- 提高重用性、可读性、可靠性
常见的23种设计模式
根据各个模式的作用和目的可划分为
创建型模式、结构型模式和行为型模式
3 种。
根据模式的操作对象来分(类或对象),可分为
类模式和对象模式
2种。
- 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。
- 工厂方法、(类)适配器、模板方法、解释器属于类模式。
- 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。
- 除了以上 4 种类模式,其他的都是对象模式。
设计模式的的7大原则
你可能没有听过设计模式的原则,但是想必你一定知道面向对象设计的原则
。如果都是第一次听说,那么接着往下看
在设计模式中,所有的模式都是基于这些设计原则来解决问题
- 依赖倒转原则(Dependence Inversion Principle)
- 高层模块(稳定)不应该依赖低层模块(变化),二者都依赖抽象(稳定)。抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)
- 开闭原则(Open Close Principle)
- 充分发挥面向对象,对现实事物进行抽象化,实现对扩展开放,对修改关闭,
程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果
- 充分发挥面向对象,对现实事物进行抽象化,实现对扩展开放,对修改关闭,
- 单一职责原则(Single responsibility principle)
一个类因其他变化的原因只有一个职责
。多个职责会引起耦合,牵一发动全身,此原则的核心是解耦和增强内聚性。
- 里氏代换原则(Liskov Substitution Principle)
- 实现抽象化的具体步骤规范,
子类可以当作父类用,并拥有自身独有的行为
- 实现抽象化的具体步骤规范,
- 接口隔离原则(Interface Segregation Principle)
- 使用多个隔离的接口
优于
单个重度耦合接口,降低依赖,降低耦合
- 使用多个隔离的接口
- 迪米特法则,又称最少知道原则(Demeter Principle)
- 一个实体应当尽可能少的与其他实体产生联系,
防止过度耦合
- 一个实体应当尽可能少的与其他实体产生联系,
- 合成复用原则(Composite Reuse Principle)
- 尽量使用合成/聚合的方式,
而不是使用继承
。
- 尽量使用合成/聚合的方式,
设计模式的的四大要素
软件设计模式使人们可以更加简单方便地复用成功的设计和体系结构,它通常包含以下几个基本要素:
模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等
其中最关键的元素包括以下 4 个主要部分。
- 模式名称(PatternName)
- 对于一个模式进行命名,模式名称有助于我们理解和记忆该模式计。
- 问题(Problem)
- 问题描述了该模式的应用环境。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。
- 解决方案(Solution)
- 针对问题的解决方案,其内容给出了设计的各个组成部分,它们之间的关系、职责划分和协作方式
- 效果(Consequence)
- 描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。
最后
本文是根据
Gang of Four
书中的23中设计模式展开讨论的,实际上,经过了近25年的发展,设计模式已经不仅仅局限于这23种。
设计模式是前辈们总结的优秀代码设计经验,是无法依次完全掌握的,其中很多都是需要结合实际场景的,需要我们先学习这种思想,学习前辈们优秀的案例,逐渐培养自己对代码的思维模式,当你遇到相应的场景时,能够知道通过何种设计模式进行优化,通过这种理解加应用的过程,就是对设计模式的逐渐掌握。
学习新知识都是需要循序渐进,当你了解了这23种典型的设计模式,并对它有一定理解后,相信无论是在日常开发,还是CodeReview时都可以设计和写出优秀的代码。