呕心沥血整理的Java零基础入门到精通全套知识点教程
作者:互联网
首先要学的是计算机基础知识,因为 Java 不是像 Python 那样简单,它是需要一定基础的,如果你上来直接硬肝 Java,那么 90% 的几率你会放弃。
因为要想学好 Java ,你就得理解什么是面向对象的设计思想,而面向对象的这种设计思想又不是刚开始学习编程的新人能够熟练掌握呢?那怎么办呢?这不是死局了吗?
其实,如果要想真正理解这种设计思想的话,首先可以先去了解下C语言,再学习Java。
为什么呢?因为 C 语言是面向过程的,什么是面向过程和面向对象的设计思想呢?
我给你举个例子你就知道了。
面向过程与面向对象的区别,由“如何把大象装进冰箱”来看:
一、面向过程
为了把大象装进冰箱,需要3个过程。
思路:
1、把冰箱门打开(得到打开门的冰箱)。
2、把大象装进去(打开门后,得到里面装着大象的冰箱)。
3、把冰箱门关上(打开门、装好大象后,获得关好门的冰箱)。
根据上面的思路,可以看到,每个过程都有一个阶段性的目标,依次完成这些过程,就能把大象装进冰箱。
二、面向对象
为了把大象装进冰箱,需要做三个动作(或者叫行为)。每个动作有一个执行者,它就是对象。
思路:
1、冰箱,你给我把门打开。
2、冰箱,你给我把大象装进去(或者说,大象,你给我钻到冰箱里去)。
3、冰箱,你给我把门关上。
依次完成这些动作,你就可以把大象装进去。
这里我只是举个例子。
好了,那么从现在开始,我们就要进入 Java 的学习环节了。
学习 Java,我将会从三个阶段来介绍,分为初级、中级和高级
计算机基础
计算机基础都包括哪些呢?
计算机组成原理、操作系统、计算机网络、数据结构与算法。
计算机组成原理
先说计算机组成原理,这部分内容主要涉及
计算机系统概述
- 数据与运算
- CPU 概述
- 存储子系统概述
- 总线和 IO 概述
Java 基础
什么是初级 Java 的水平呢?我认为就是理解 Java 的语法规则、语言特性,这么说有点干瘪,直接上思维导图!
就这一张图,如果你能把图中内容都理解的差不多,那你就可以说是入门 Java 了,但是这里要注意一个概念,这并不等于说你是一个合格的初级 Java 程序员了,因为要想达到初级 Java 程序员的水平,你要会能干活,能干活的标准是你要懂框架,不要急,我们后面会说。
有人问图中为什么没有并发或者 Java 虚拟机这些,这些属于中高级内容,刚开始学 Java 不用懂什么并发和 JVM!!!
那么话又说回来了,如何才能学习并了解到上面这些内容呢?接下来重点来了!!!
如果你能看到这里,我就认为你养成了每日编程的习惯,此时的你能够静下心来编程了。
那么我首先给你推荐一本初学 Java 非常合适的一本书
Head First Java
《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程、网络与分布式程序等项目。最重要的,你会学会如何像个面向对象开发者一样去思考。
视频观看:
https://www.ixigua.com/6798426044178104839
如果你能掌握上面的基础内容部分,我觉得你应该花至少 3 - 6 个月,如果你能坚持下来的话,这里我需要鼓励一下你,但是不要自满,因为这才只是最最最最基础的部分,但是现在你可以说是一只脚踏入 Java 大门了。
MySQL
MySQL 其实要和 Java 基础一起学习,你学完 Java 基础就可以学 MySQL 了。
此时的 MySQL 我指的是 MySQL 基础,因为 MySQL 博大精深,想要深入理解 MySQL 不容易,而且我们一般 Java 开发把 MySQL 掌握到中级水平就可以了。
MySQL 初级水平就是要求你会写 MySQL ,这里推荐个视频教程,由初级到高级一套搞定!
视频观看:
https://www.ixigua.com/6794696042571891204
MySQL需要掌握的知识点:
- MySQL数据库概述及数据准备
- MySQL安装教程
- SQL分类
- MySQL导入数据
- MySQL数据库表与MySQL表结构
- MySQL数据库常用命令
- MySQL查询字段
- MySQL条件查询
- MySQL排序
- MySQL函数
- MySQL分组函数/聚合函数/多行处理函数
- MySQL分组查询
- MySQL连接查询
- MySQL子查询
- MySQL UNION
- MySQL中limit的用法
- MySQL表
- MySQL存储引擎
- MySQL事务
- MySQL索引
- MySQL视图
- MySQL DBA命令
- MySQL数据库设计的三大范式
MySQL 高级内容是在工作中慢慢掌握的,如果你想要成为初级 Java 程序员,掌握这些内容,并且跟着敲下来,那么就可以说你的 MySQL 已经达到入门水准了,可以进行下面的学习了!!
Javaweb
JavaWeb用Java技术来解决相关web互联网领域的技术总和。Java提供了技术方案可以解决客户端和服务器端的实现,特别是服务器的应用,比如Servlet,JSP和第三方框架等等。
对于JavaWeb,我们需要掌握的知识有:
Servlet,JSP,MVC设计模式,Cookie,Session,JavBean组件技术,EL表达式,JSTL表达式,过滤器Filter,监听器Listener,文件的上传下载,国际化。
视频观看:
https://www.ixigua.com/6935719174542983718
设计模式
设计模式放在这里不是让你马上就要学习的(当然你也可以学习,没有人能阻碍你学习),因为设计模式涉及到你工作的方方面面。有些设计模式你可能这辈子都用不到,但是你需要了解其思想,以便写出思路严谨,条理清晰的代码。
设计模式我给你推荐几本书,你看哪个都行。
Head First 设计模式
这本书虽然只有 14 章,但是却介绍到了所有的二十三种设计模式,每一种设计模式都有对应的应用案例,以风趣幽默的语言描述来一步一步为你揭开设计模式的面纱,告诉你设计模式的演进过程。
读这本书不仅仅是学习知识,而是在学习一种思考的方法,学习一种认知的技巧,学习一种成长的阶梯。总之,用你闲暇的时间来读这本书,并不亚于你专注的工作或学习。
图解设计模式
设计模式更多是一种思想,而不是一种固定的代码编写方式,千万不要局限于这些条条框框。日本人的书写的就是非常通俗易懂,适合小白。194张图表 + Java示例代码 = 轻松理解 GoF 的23种设计模式。
本书以浅显易懂的语言逐一说明了 GoF 的 23 种设计模式。在讲解过程中,不仅搭配了丰富的图片,而且理论结合实例,用 Java 语言编写代码实现了设计模式的程序,让程序真正地运行起来,并提供了运用模式解决具体问题的练习题和答案。
除此以外,本书在必要时还对 Java 语言的功能进行补充说明,以加深读者对 Java 的理解,在学习设计模式的同时也在复习 Java。
上面这两本书非常适合初学者学习设计模式
设计模式并不适合一口气读完,因为你看完几个设计模式就会容易混,相信我,你可以一周熟悉一个设计模式,这样在工作中你也可以使用。一口气看完所有,就会记住最后一个设计模式,相信我,亲身实践。
Java 进阶
Java 进阶需要学习的东西就有很多了,内容涉及许多方面,我们接下来就来和你聊聊。
注意:当你学会这些 Java 进阶的内容后,不代表你就是一个中级程序员了,恰恰相反,你需要把这些知识融会贯通并运用到项目/实践中去。掌握多少就看你自己了。
首先是 Java 多线程,下边列出来多线程应该掌握的知识点:
- 什么是进程、线程?线程和进程的区别?
- 多线程的优势
- Java中创建线程方法
- 用Runnable还是ThreadJava以及创建线程两种方法对比?
- Thread 类中的start() 和 run() 方法有什么区别?
- 线程的生命周期
- java控制线程方法
- sleep()方法和yield()方法的区别
- 为什么Thread类的sleep()和yield()方法是静态的?
- sleep方法与wait方法的区别?
- 线程安全问题
- 同步代码块
- 同步方法
- 何时会释放对同步监视器锁定?
- 同步锁(Lock)与死锁
说到这里,推荐几本关于 Java 并发方面的书。
Java 并发编程实战
不要犹豫了,这本书就是并发编程界的王者,也是你必看的一本书。
外版书籍不会和你讨论什么源码啥的,他们只看思想,思想有了,实现也就轻而易举。所以并发编程实战讨论更多的是思想,这本书同时也罗列了很多伪代码和应用场景来验证这些思想。
这本书并不完全适合国内互联网现状,因为在八股文、背书如此盛行的今天,想要进大厂,成为"高级程序员",你还要懂一些八股文。
Java 并发编程艺术
所以如果你想要在国内找工作的话,那么下面这本书,更适合你。不要为我为什么,阿里人写的。
这本书罗列出来的一些知识点,其实都是大厂所经常问到的,所以这本书值得你仔细研读。
说到这里,那么 Java 并发这块你应该掌握的知识点都有哪些呢?
- 进程和线程的概念
- Java 多线程基础,
- Java 线程状态以及线程状态的转换
- Java 线程间的通信机制
- 理解 Java 内存模型
- happens-before
- volatile 关键字解析
- Synchronized 关键字解析
- CAS 与原子操作
- AQS 大厂面试必问的 AQS
- 线程池相关原理
上面的内容如果你能理解,那么你 Java 这部分已经可以算是高级水平了,你去大厂面试问一些八股文,多线程这块问题不大了。
JVM
Java 虚拟机也叫做 JVM ,这部分是判断一个 Java 程序员分水岭的关键,如果你想要达到中高级 Java 程序员的层次,那么 JVM 是你必须要突破和提高的一个点。下面我就来和大家聊一下 JVM 都需要了解哪些内容。
还是照例先给大家介绍几本了解 JVM 非常优秀的书籍
深入理解 Java 虚拟机
这本书是你必看的一本,而且作者是我们国内的周志明,国内作者一般讲实现比较多,专业术语比较少,这本书讲的更是通俗易懂,虽然有许多概念,不过周志明大佬都给出了示例和解释
豆瓣能给出国内作者 9.5 的评分,可知这本书写的有多好了,这本书是了解 JVM 非常经典的一本书,五星强烈推荐。
Java 虚拟机规范
Java 虚拟机规范同样也是周志明大佬参与翻译的一本,这本书的权威性不容置疑,其实就是按照 Java 官方文档来写的,可以说看完这一本在面试的时候聊到 JVM 你都能够给出 “官方” 回答,大大增加你的面试通过几率。
虽然有很多高质量JVM书籍,但由于JVM晦涩难懂的技术原理以及术语描述导致新手看书过程中很容易从入门到放弃
视频观看:
https://www.ixigua.com/6981367790372389414
主要掌握知识点:
- Java 内存划分与内存管理
- JVM 中的垃圾收集器
- JVM 性能监控
- JVM 调优
- JVM 中的类文件结构
- JVM 类加载机制
- JVM 字节码
上面这些内容真正掌握起码要花 2 - 3 年的时间,也不是说这三年你就学上面这些东西,你可以学习其他的,我下面推荐的这些,就是在这个时间段内你应该掌握的。
Maven
在学习框架前,我建议你先了解一下什么是 Maven,以及项目为什么要使用 Maven
Maven 对于初学者来说,只做为了解即可,但是 Maven 这个优秀的架构是如何简化代码的,如何让我们更方便的使用,以及 Maven 中的一些不为人知的秘密。
视频观看:
https://www.ixigua.com/6772335925071446531
下面该学啥了?终于到了框架了!!! 作为一门开发,框架就是你的武器!!!就是玩儿!在抗美援朝的时候,志愿军使用轻武器加迫击炮照样干翻米国骑兵第一师和陆战第一师这种王牌军队。
框架要学习的就是 SpringMVC 、Spring 、MyBatis
框架首先要学的就是 MyBatis
MyBatis
MyBatis 入门
推荐这本书是我刚开始学 MyBatis 的时候看的,书中的内容我对照着都敲了一遍,可以说是非常有参考价值的一本。
《MyBatis从入门到精通》中从一个简单的MyBatis查询入手,搭建起学习MyBatis的基础开发环境。通过全面的示例代码和测试讲解了在MyBatis XML方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态SQL在不同方面的应用以及在使用过程中的最佳实践方案。针对MyBatis高级映射、存储过程和类型处理器提供了丰富的示例,通过自下而上的方法使读者更好地理解和掌握MyBatis的高级用法,同时针对MyBatis的代码生成器提供了详细的配置介绍。
MyBatis 这部分内容可以看下视频,更容易理解
https://www.ixigua.com/6772337398400418307
那么 MyBatis 都应该掌握哪些内容呢?当然你要会用 MyBatis 了,用法直接看视频教程或者 MyBatis 从入门到精通这本书就可以了。
- MyBatis框架概述
- MyBatis框架快速入门案例
- MyBatis框架Dao代理
- MyBatis框架动态SQL
- MyBatis配置文件
- 扩展
Spring
在学完 MyBatis ,就该学习我们的核心框架 Spring 了,Spring 能风靡到现在一定有他的道理,等你到工作中再慢慢体会它的精髓。
学习 Spring ,我首先给你推荐的一本书就是 Spring 实战,也就是 Spring In Action,这本书我认为即使学习 Spring 最好的一本,没有之一了。
视频观看:
https://www.ixigua.com/6772336469072675339
关于 Spring,有哪些需要学习的东西呢?
- Spring概述
- loC控制反转
- AOP面向切面编程
- Spring集成MyBatis
- Spring事务
- Spring与Web
Spring 单独拿来使用的场景非常少,更多是作为框架的整合来用,Spring 最主要的特点就是两个:IOC 容器和 Aop,IOC 容器就是 Spring 和 各种资源整合的基础,可以说有了 IOC 的这个特点,才会有 bean 的装配,自动装配等等特性,而 Aop 就是减少业务耦合性的一种技术,让我们能够以"切面"的方式来看到业务关联性。最主要的就是这两项技术,把这两项技术弄懂了 Spring 就差不多了。
Spring MVC
SpringMVC 终于来了!!!!为什么最后再说 SpringMVC,因为Spring MVC 其实就是 Servlet 的一种封装,而且 Spring MVC 打交道的对象是 HTTP 协议,所以你需要先掌握上面知识再学 Spring MVC。
学习 SpringMVC,视频可以看看这个
https://www.ixigua.com/6772336921155731976
那么关于 SpringMVC 都需要掌握哪些内容呢?
- Spring MVC概述
- Spring MVC 解析之 DispatcherServlet
- Spring Web MVC-过滤器与拦截器 Handler and Filter
- SpringMVC全局异常处理
- SpringMVC 单文件上传与多文件上传
- SpringMVC上传文件的三种方式
- SpringMVC中的文件上传与下载
- Spring MVC打印@RequestBody、@Response日志
- Spring MVC拦截器实现用户登录权限验证
- Spring MVC框架原理分析
- SpringMVC - 视图解析过程
- RestTemplate
- Spring MVC中使用RestTemplate访问REST服务详解
- SpringMVC之Controller常用注解功能全解析
- MVC设计模式介绍 & SpringMVC实现
当你从 Java 基础 -> MySQL基础 ->Javaweb -> MyBatis -> Spring -> SpringMVC 学完之后,我觉得你应该需要花 1 - 2 年左右的时间,此时的你应该能够具备完成一个小型 SSM 项目的能力了,现在先不忘下面继续学习了,你应该把你的知识进行整合,你可以按照书中的内容搭建小型项目,或者完成一些 SSM 项目等,很多 Java 方向的毕业设计也就到这里就能完事儿了。
Java毕业设计视频:
https://www.ixigua.com/6969831045722178061
此时的你,可以说能够具备一个初级 Java 开发的基本素质了,但是你可能还找不到工作,为什么?因为现阶段最最最流行的框架你还没有接触,下面有请大名鼎鼎的 SpringBoot 大佬登场。
SpringBoot
SpringBoot 可以说是当今 Java 领域最火的框架了,那么 SpringBoot 为什么这么火呢?
从设计理念谈起
要说到 Spring Boot 为什么这么火,就必须得聊聊 Spring Boot 的设计理念,正是此设计理念奠基了Spring Boot 开发设计的基准,让 Spring Boot 走到了今天。
那 Spring Boot 的设计理念是什么呢?
它就是约定优于配置(convention over configuration)。
约定优于配置并不是一个新概念,它是一种软件设计范式,很早就应用在软件架构设计中,它的作用是减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
只是 Spring Boot 让这个设计理念上升了一个层次,Spring Boot 不止在某个功能上实现此设计理念,而是整个软件体系都在践行约定优于配置。
Spring Boot 体系将约定优于配置的思想展现得淋淋尽致,小到配置文件,中间件的默认配置,大到内置容器、生态中的各种 Starters 无不遵循此设计规则。
Spring Boot Jpa 80% 大部分查询功能都以约定的方式给与提供,另外 20% 复杂的场景,提供另外的技术手段来解决,典型的约定优于配置的实现。
Spring Boot Starter ,在项目启动的时候,根据约定信息对组件进行加载、初始化。因此项目中引入了对于的 Starter 之后,就可以到达开箱即用的效果。
甚至 Spring Cloud 的设计,也借鉴了约定优于配置的思想,很多组件都是在启动时,默认提供了其相关的功能,可以让我们的使用到达很少配置或者零配置。
所以你只需要再学习完 SpringBoot ,就能够完成一个初级 Java 开发的用人需求了。所以你必须要学好 SpringBoot。
视频观看:
https://www.ixigua.com/6824729668344611340
其实你学了一段时间就会发现,SpringBoot 就完全是个脚手架,方便我们快速搭建一个项目,简化了配置,不用再让你写繁杂的 XML 表达式,相反的而是用 注解 来实现,他们的原理类似,只不过使用注解能让你的项目更加简洁。
Spring Cloud
Spring Cloud 是以 SpringBoot 为基础的微服务项目架构,现在大多数互联网公司甚至一些传统行业都开始用 Spring Cloud 为基础架构,有些是因为业务需求,有些是为了装 B,反正不管怎样,面试官问起你会不会 Spring Cloud,你说不会的话,那么你的印象分估计会降低,所以初级程序员,或多或少要了解一下 Spring Cloud 。
视频观看:
https://www.ixigua.com/6885622656545391116
Dubbo
说完了 Spring Cloud,怎能少的了 Dubbo?
https://www.ixigua.com/6824745322846093838
Redis
Redis 可以说是最流行的 NoSQL 数据库了,你可能不知道 Redis 是干什么用的,我先给你普及一下。
缓存数据库目前最常用的两种就是 Redis 和 Memcached,与 Memcached 相比 Redis 其一大特点是支持丰富的数据类型(Memcached 只能用 string 类型)。Redis 因为其丰富的数据结构因此应用范围不局限于缓存,有很多场景用 Redis 来实现可以大大减少工作量。
视频观看:
https://www.ixigua.com/6772338007803429387
Nginx
Nginx 基础知识
Nginx 是什么?
Nginx 是一个 web 服务器,主要处理客户端和服务器的请求分发。
特点和优势:
- 高并发
- 热部署
- 快
- 低功耗
- 热部署
- 使用和扩展
开源免费的Nginx与商业版Nginx Plus,与之对应的是免费OpenResty与商业版OpenResty
- 开源版 http://nginx.org
- 商业版 NGINX Plus
- 阿里巴巴 Tengine
- 开源版 OpenResty
- 商业版 OpenResty
Nginx 正向代理与反向代理
为了便于理解,首先先来了解一下一些基础知识,nginx是一个高性能的反向代理服务器那么什么是反向代理呢?
代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。
不管是正向代理还是反向代理,实现的都是上面的功能。
视频观看:
https://www.ixigua.com/6907437541557797390
正向代理
正向代理(forward)意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标 (原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。
正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
Netty
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。
Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke’s Choice Award,见
https://www.java.net/dukeschoice/2011)。它活跃和成长于用户社区,像大型公司 Facebook 以及流行 开源项目如 Infinispan, HornetQ, Vert.x, Apache Cassandra 和 Elasticsearch 等,都利用其强大的对于网络抽象的核心代码。
Git
Git 是一款优秀的分布式版本控制平台,代码协作通常用于团队或者多人共同开发一个项目的情况,刚开始接触代码协作可能无法理解,就是说你和你的同事共同开发一个项目的话,你们的代码也要放在一起,你提交的代码对方能够看到,对方提交的代码你也能够看到。
不用在说什么我改了代码我发给你,一方面你知道你改过内容可能会有遗漏,有一些人说那记录好改了哪些文件不就行了吗?但是你这样工作量多大?而且假如你和你同事改的是同一个文件呢?还要记住同一个文件中有多少内容是改没改过的嘛?
这太麻烦而且低效了,所以 Git 就是用于解决这种情况的,Git 目前是大多数企业的选择,但是仍旧还有一些传统的软件公司使用 SVN,SVN 也是代码协作平台,下面具体介绍一下 Git:
- Git 是分布式的,SVN 是集中式的
- Git是分布式的,SVN是集中式的
这是 Git 和 SVN 最大的区别。若能掌握这个概念,两者区别基本搞懂大半。因为 Git 是分布式的,所以 Git 支持离线工作,在本地可以进行很多操作,包括接下来将要重磅推出的分支功能。而 SVN 必须联网才能正常工作。
Git 复杂概念多,SVN 简单易上手
所有同时掌握 Git 和 SVN 的开发者都必须承认,Git 的命令实在太多了,日常工作需要掌握add,commit,status,fetch,push,rebase等,若要熟练掌握,还必须掌握rebase和merge的区别,fetch和pull的区别等,除此之外,还有cherry-pick,submodule,stash等功能,仅是这些名词听着都很绕。
在易用性这方面,SVN 会好得多,简单易上手,对新手很友好。但是从另外一方面看,Git 命令多意味着功能多,若我们能掌握大部分 Git 的功能,体会到其中的奥妙,会发现再也回不去 SVN 的时代了。
Git 分支廉价,SVN 分支昂贵
在版本管理里,分支是很常使用的功能。在发布版本前,需要发布分支,进行大需求开发,需要 feature 分支,大团队还会有开发分支,稳定分支等。在大团队开发过程中,常常存在创建分支,切换分支的需求。
Git 分支是指针指向某次提交,而 SVN 分支是拷贝的目录。这个特性使 Git 的分支切换非常迅速,且创建成本非常低。
而且 Git 有本地分支,SVN 无本地分支。在实际开发过程中,经常会遇到有些代码没写完,但是需紧急处理其他问题,若我们使用 Git,便可以创建本地分支存储没写完的代码,待问题处理完后,再回到本地分支继续完成代码。
视频观看:
https://www.ixigua.com/6903813762755592716
学习 Git 的方式有很多种,但是最主要的还是你动手实践,不管是看书也好还是根据教程进行实操,你都需要实践一遍,那么 Git 的使用你就差不多了。
最后,一些建议:
学编程,要记住两个字“戒贪”!
不过学一半,还没学透了,就想去学其他的技术。
这是非常致命的!学习务必要脚踏实地!
为什么说这个,因为我自己曾经吃过这种亏,所以多嘴提了一句。
给自己一个目标,或者一个项目,在完成之前,不要去考虑其他的事情,道理和爬山是一样的。等你学完后,再去学其他的!
标签:知识点,Git,Java,Spring,呕心沥血,MySQL,MyBatis,设计模式 来源: https://blog.csdn.net/tomfyyds/article/details/121643440