惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
SecWiki News
SecWiki News
Project Zero
Project Zero
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Scott Helme
Scott Helme
A
Arctic Wolf
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
The Hacker News
The Hacker News
T
Tenable Blog
雷峰网
雷峰网
有赞技术团队
有赞技术团队
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
T
Threatpost
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
SegmentFault 最新的问题
月光博客
月光博客
Spread Privacy
Spread Privacy
S
Secure Thoughts
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
Forbes - Security
Forbes - Security
T
The Exploit Database - CXSecurity.com
G
GRAHAM CLULEY
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
I
Intezer
博客园 - 【当耐特】
B
Blog RSS Feed
Attack and Defense Labs
Attack and Defense Labs
I
InfoQ
博客园 - 叶小钗
Cyberwarzone
Cyberwarzone
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
C
CERT Recently Published Vulnerability Notes

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序2:希尔排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(七):Nacos共享配置 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 DockerFile介绍 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 Vert.x介绍 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
设计模式总览 | Java技术经验分享
文章作者: LarsCheng · 2019-10-29 · via Java技术经验分享

前言

前段时间,跟着Gang of Four学习了设计模式,虽然23种设计模式都过了一遍,好像懂了但是好像又有些不明白。刚好在软考备考时设计模式也是考点。故此,通过这一次的再复习索性整理出设计模式的一套学习笔记,笔记中会通过生活中的例子详细讲解各种常用模式,并利用Java代码实现。

本文主要通过以下几点来对设计模式进行总结:

  1. 设计模式的背景
  2. 设计模式的概念
  3. 设计模式的的7大原则
  4. 设计模式的的4大要素
  5. 常见的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 种。

模式类型 模式
创建型模式(5)
对象怎么来:用于创建对象
● 工厂模式(Factory Pattern)
● 抽象工厂模式(Abstract Factory Pattern)
● 单例模式(Singleton Pattern)
● 建造者模式(Builder Pattern)
● 原型模式(Prototype Pattern)
结构型模式(7)
对象和谁有关:用于处理类或对象的组合
● 适配器模式(Adapter Pattern)
● 桥接模式(Bridge Pattern)
● xxx过滤器模式(Filter、Criteria Pattern)
● 组合模式(Composite Pattern)
● 装饰器模式(Decorator Pattern)
● 外观模式(Facade Pattern)
● 享元模式(Flyweight Pattern)
● 代理模式(Proxy Pattern)
行为型模式(11)
对象与对象在干嘛:用于描述类、对象相互交互的责任分配
● 责任链模式(Chain of Responsibility Pattern)
● 命令模式(Command Pattern)
● 解释器模式(Interpreter Pattern)
● 迭代器模式(Iterator Pattern)
● 中介者模式(Mediator Pattern)
● 备忘录模式(Memento Pattern)
● 观察者模式(Observer Pattern)
● 状态模式(State Pattern)
● xxx空对象模式(Null Object Pattern)
● 策略模式(Strategy Pattern)
● 模板模式(Template Pattern)
● 访问者模式(Visitor Pattern)

根据模式的操作对象来分(类或对象),可分为类模式和对象模式2种。

  • 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。
    • 工厂方法、(类)适配器、模板方法、解释器属于类模式。
  • 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。
    • 除了以上 4 种类模式,其他的都是对象模式。

设计模式的的7大原则

你可能没有听过设计模式的原则,但是想必你一定知道面向对象设计的原则。如果都是第一次听说,那么接着往下看

在设计模式中,所有的模式都是基于这些设计原则来解决问题

  1. 依赖倒转原则(Dependence Inversion Principle)
    • 高层模块(稳定)不应该依赖低层模块(变化),二者都依赖抽象(稳定)。抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)
  2. 开闭原则(Open Close Principle)
    • 充分发挥面向对象,对现实事物进行抽象化,实现对扩展开放,对修改关闭,程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果
  3. 单一职责原则(Single responsibility principle)
    • 一个类因其他变化的原因只有一个职责。多个职责会引起耦合,牵一发动全身,此原则的核心是解耦和增强内聚性。
  4. 里氏代换原则(Liskov Substitution Principle)
    • 实现抽象化的具体步骤规范,子类可以当作父类用,并拥有自身独有的行为
  5. 接口隔离原则(Interface Segregation Principle)
    • 使用多个隔离的接口优于单个重度耦合接口,降低依赖,降低耦合
  6. 迪米特法则,又称最少知道原则(Demeter Principle)
    • 一个实体应当尽可能少的与其他实体产生联系,防止过度耦合
  7. 合成复用原则(Composite Reuse Principle)
    • 尽量使用合成/聚合的方式,而不是使用继承

设计模式的的四大要素

软件设计模式使人们可以更加简单方便地复用成功的设计和体系结构,它通常包含以下几个基本要素:

模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等

其中最关键的元素包括以下 4 个主要部分。

  1. 模式名称(PatternName)
    • 对于一个模式进行命名,模式名称有助于我们理解和记忆该模式计。
  2. 问题(Problem)
    • 问题描述了该模式的应用环境。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。
  3. 解决方案(Solution)
    • 针对问题的解决方案,其内容给出了设计的各个组成部分,它们之间的关系、职责划分和协作方式
  4. 效果(Consequence)
    • 描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。

最后

本文是根据Gang of Four书中的23中设计模式展开讨论的,实际上,经过了近25年的发展,设计模式已经不仅仅局限于这23种。

设计模式是前辈们总结的优秀代码设计经验,是无法依次完全掌握的,其中很多都是需要结合实际场景的,需要我们先学习这种思想,学习前辈们优秀的案例,逐渐培养自己对代码的思维模式,当你遇到相应的场景时,能够知道通过何种设计模式进行优化,通过这种理解加应用的过程,就是对设计模式的逐渐掌握。

学习新知识都是需要循序渐进,当你了解了这23种典型的设计模式,并对它有一定理解后,相信无论是在日常开发,还是CodeReview时都可以设计和写出优秀的代码。