从零开始学习Java设计模式 | 设计模式入门篇:设计模式概述
在上一讲中,明确了设计模式这门课所要学习的内容之后,接下来,我们就得开始正式步入设计模式这门课的学习中了,当然,我也祝大家能在设计模式这门课程中能够学到很多东西,也不枉我这一片苦心了!
软件设计模式的产生背景
首先,我们来看一下第一章中的第一部分内容,即设计模式概述。而在设计模式概述里面,我们第一个要明了的就是软件设计模式的产生背景。因为我们既然要学习软件设计模式,那么就得知道一下它的背景,我想这是毋庸置疑的。
"设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。
从这句话中我们可以知道,软件设计模式来源于建筑领域的设计。
1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大在他的著作《建筑模式语言:城镇、建筑、构造》中描述了一些常见的建筑设计问题,并提出了253种关于对城镇、邻里、住宅、花园和房间进行设计的基本模式。
从这句话中,我们第一次了解到了设计模式,只不过这个设计模式,它是属于建筑领域的设计模式。
1990年软件工程界开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。直到1995年艾瑞克·伽马、理査德·海尔姆、拉尔夫·约翰森、约翰·威利斯迪斯等4位作者合作出版了《设计模式:可复用面向对象软件的基础》这一本书,在此书中收录了23个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这4位作者在软件开发领域里也以他们的"四人组"(Gang of Four,简称GoF)著称。
很明显,我们所要学习的设计模式其实就是以上提到的这23种设计模式,而且,另外一点,大家也一定要记住,GoF我们在后面也会遇到,它指的其实就是以上这4个人的一个简称。
软件设计模式的概念
知道了软件设计模式的产生背景之后,我们就得来了解了解软件设计模式的概念了,软件设计模式的概念如下:
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。
这句话读起来还是有点绕口的,不过大家一定要知道一点,就是软件设计模式它并不是什么新的技术,而是代码设计经验的一个总结,即总结出来的一些套路。谁总结出来的呢?其实就是软件开发的那些前辈们,他们在软件开发过程中遇到了一些问题,然后针对这些问题他们提供好了解决的方案,而这些解决方案就是总结出来的一些套路,也可以说成是设计模式。
那么,以后我们在设计咱们自己的软件过程中,就可以将这些设计模式套用到我们自己的软件中了,从而使得我们的程序变得更加完美,软件设计得更加完美。
学习设计模式的必要性
为什么要学习设计模式呢?我们可以看一下下面这句话。
设计模式的本质是面向对象设计原则的实际应用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。
我在上面也已经说过了,设计模式它并不是一门新的技术,而是对于我们之前学习的面向对象开发的一个实际的应用。之前我们学完了面向对象开发之后,想必你会有很多感触,我想第一个感触就是面向对象开发它到底有什么用,以及在我们以后真正的软件开发中又能起到什么作用?我想你只要学完设计模式这门课,就能有更深的体会了,因为实践出真知嘛!
以上那句话的后半句中的类的关联关系和组合关系
,现在如果你还不理解的话,也没关系,因为后面我会对它作一个详细的讲解。
其次,我们应该还要知道正确使用设计模式所具有的如下几个优点。
- 可以提高程序员的思维能力(即让我们的思维更加开阔,如果后期我们要去设计咱们的软件的话,那么就能套用这些设计模式去设计咱们的软件了)、编程能力和设计能力。当然,在这里我们更强调的是设计能力
- 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期
- 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强
以上说的这些优点,字面意思都看得懂,但问题是现在体现不出来,因为我们还没有学习到这些设计模式。等我们学完了设计模式之后,大家不妨再来深刻地体会一下这些好处。
设计模式的分类
通过前面的学习,我们知道设计模式有23种,而且想必大家也知道了这23种设计模式又可分成三大类,即:
- 创建型模式
- 结构型模式
- 行为型模式
那么接下来,我再来为大家一个一个地详细介绍下这些分类。
创建型模式
什么是创建型模式呢?大家看下面这句话便能知道答案了。
用于描述"怎样创建对象",它的主要特点是"将对象的创建与使用分离"。
看到这儿的话,有些同学可能会想,创建对象这个谁不会啊!不就是new一个对象嘛!比如说现在有一个Student类,那么要创建对象的话,new一个Student不就行了嘛,这样对象就创建好了。
不错,这说的没有任何问题,但是我们现在讨论的是创建型模式啊!而它最主要的特点就是将对象的创建和使用分离。可按照我们之前的做法,更多的是创建好对象之后,就开始使用这个对象了,那么从某种意义上来说,创建型模式其实就是进行了一个解耦。
最后,我们再看一下GoF四人组,他们的书中都提供了哪些创建型模式,我也不废话,直接就列出来了,如下所示,提供了5种创建型模式。
- 单例模式
- 原型模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
结构型模式
什么是结构型模式呢?大家看下面这句话便能知道答案了。
结构型模式用于描述如何将类和对象按照某种布局组成更大的结构。
这句话,怎么去理解呢?我来举个例子吧!比如说,你现在要盖房,那么创建型模式就好比你去购买盖房所需要的材料,如钢筋、水泥等等,然后用这些材料你就能搭起来整个房屋的架构了,这个就是所谓的结构型模式。
那么GoF四人组他们在自己的书中提供了哪些结构型模式呢?大家也不用翻书了,我直接列出来了,如下所示,提供了7种结构型模式:
- 代理模式
- 适配器模式
- 桥接模式
- 装饰者模式
- 外观模式
- 享元模式
- 组合模式
行为型模式
什么是行为型模式呢?大家看下面这句话便能知道答案了。
用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。
这句话要理解清楚也非常简单,就是多个对象合作去完成某一件事。
那么GoF四人组他们在自己的书中提供了哪些行为型模式呢?大家也不用翻书了,我直接列出来了,如下所示,提供了11种结构型模式:
- 模板方法模式
- 策略模式
- 命令模式
- 责任链模式
- 状态模式
- 观察者模式
- 中介者模式
- 迭代器模式
- 访问者模式
- 备忘录模式
- 解释器模式
从零开始学习Java设计模式 | 设计模式入门篇:设计模式概述相关推荐
- [转载]从零开始学习jQuery (一) 开天辟地入门篇
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 本篇文章是入门第一篇, 主要是简单介绍jQuer ...
- 【PaddlePaddle学习笔记】从零开始学习图像分类01——图像处理入门基础
本系列文章链接 [PaddlePaddle学习笔记]从零开始学习图像分类01--图像处理入门基础 未完待续...... 目录 一.关于图像的几个基本概念 1. 像素及其坐标 2. 图像的四种基本类型 ...
- 【学习笔记】JavaWeb入门篇—HTML
[学习笔记]JavaWeb入门篇-HTML
- Java新手小白入门篇 Java基础(一)
Java新手小白入门篇 Java基础 Java新手小白入门篇 Java基础(知识点体系汇总) Java新手小白入门篇 Java基础(一) Java新手小白入门篇 Java基础(二) Java新手小白入 ...
- 1、Latex学习笔记之基础入门篇
目录 一.Latex基础 1.架构 2.引用.脚注 3.单栏.双栏 4.常用快捷键 5.宏包 6.空格 7.换行.行间距 8.换段 9.下划线 10.引号 11.注释 12.字体 13.缩进 14.超 ...
- java bs设计模式_Java进阶篇设计模式之十三
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- 虚无空间java下载_Java进阶篇设计模式之二 ----- 工厂模式
前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...
- 从零开始学习ASP.NET MVC 入门
<从零开始学习ASP.NET MVC 1.0> 文章导航 (一) 开天辟地入门篇 (二) 识别URL的Routing组件 (三) Controller/Action 深入解析与应用实例 ( ...
- 一文带你学习DDD,基础入门篇
系统讲解DDD的基础概念,结合具体的Demo讲解DDD落地场景. 往期精选(欢迎转发~~) 如何看待程序员35岁职业危机? Java全套学习资料(14W字),耗时半年整理 我肝了三个月,为你写出了GO ...
最新文章
- 关于“NASA”的那点事
- 一段从TXT导入excel的py脚本
- python怎么控制小数点位数_谈谈关于Python里面小数点精度控制的问题
- 守得云开见月明:一次ASM存储高可用故障解决过程分析
- react生命周期(自己的方式理解)
- android动态设置全屏,Android开发之全屏与非全屏的切换设置方法小结
- C++流水线的简易实现
- java Socket(TCP)编程小项目
- 金山词霸2006常规窗口不见了!只能看到最大化的的原因
- Hadoop配置和启动
- 深入linux网络编程(四):使用asio搭建商用服务器
- FreeSwitch基础知识
- 路由器多区域 OSPF 配置
- RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimensio
- python爬京东联盟_Python+Selenium+Chrome抓取京东商品信息
- Unity中帧数FPS的显示查看
- css案例1——一级菜单、二级菜单、三级菜单、四级菜单
- python + opencv 创建简单渐变色
- JOL探索synchronized锁-子路老师
- 什么是云计算的?云计算的定义、特征、模型分别是什么?
热门文章
- Mission Planner初学者安装调试教程指南(APM或PIX飞控)5——规划航点航线
- 【P9】Point to the Expression:Solving Algebraic Word Problems using the Expression-Pointer Transformer
- UE4中Pak文件的读取规则
- 常见文件mime类型
- binder机制原理分析(一):ServiceManager 进程启动
- 计算机可以谭音乐吗,谭真家乡类歌曲中的音乐意境分析
- 三星自定义状态栏_极简操作无需root隐藏S8导航栏和状态栏
- 双离合档把上按钮作用_你的双离合变速器是怎么工作的?
- linux bash语法检查,ShellCheck — Shell Script 语法检查工具
- BZOJ4833 [Lydsy1704月赛]最小公倍佩尔数