...
 
Commits (14)
    https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/a1eab91208c96764f8fe614b38dd9ef2103350da 2021-09-21 21:32:14 2021-09-21T21:32:14+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/e71b356ebfd8bc74c19abb555a1f67ad5be73c8f 2021-09-21 21:45:13 2021-09-21T21:45:13+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/8ec25e7c9be1e8654bd4c26f5ef06277b4378b64 2021-09-21 21:49:24 2021-09-21T21:49:24+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/318b11c4a8b2701a0231799154abcc5e93424e54 2021-09-21 21:55:52 2021-09-21T21:55:52+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/fb0b2a312248f13cedfdf4f7784bed871099dc1b 2021-09-21 22:01:20 2021-09-21T22:01:20+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/5866b55a44002f535e08b29ce44e861929cfe2eb 2021-09-21 22:05:49 2021-09-21T22:05:49+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/1309354869a10fe818e20ba359712d70e8064022 2021-09-21 22:27:49 2021-09-21T22:27:49+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/437320ee731732bb044f1afa4d65ddfa97506e0c 2021-09-21 22:34:43 2021-09-21T22:34:43+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/035fc6f35574d02bb515d882506b6648d7e65750 2021-09-21 22:39:09 2021-09-21T22:39:09+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/33413b801cf7e3fe654c242bf2de00205caf9506 2021-09-21 22:40:45 2021-09-21T22:40:45+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/06487be9047e56fbfca56696671804db7b0c8ed3 2021-09-21 22:45:40 2021-09-21T22:45:40+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/eb0ea5374731c7c49b914c3de5c09736444b8dee 2021-09-21 22:45:48 2021-09-21T22:45:48+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/aa8a861f4604374a8c44df765627696c69883dc4 2021-09-21 23:52:25 2021-09-21T23:52:25+08:00 wizardforcel 562826179@qq.com https://gitcode.net/OpenDocCN/apachecn-java-zh/-/commit/17c7b46fdadeb846ee0a2e8585a11c3e0da49e4b 2021-09-21 23:56:07 2021-09-21T23:56:07+08:00 wizardforcel 562826179@qq.com
......@@ -281,4 +281,86 @@
+ [Java 8 API 示例:字符串、数值、算术和文件](docs/modern-java-zh/ch7.md)
+ [在 Java 8 中避免 Null 检查](docs/modern-java-zh/ch8.md)
+ [使用 Intellij IDEA 解决 Java 8 的数据流问题](docs/modern-java-zh/ch9.md)
+ [在 Nashron 中使用 Backbone.js](docs/modern-java-zh/ch10.md)
\ No newline at end of file
+ [在 Nashron 中使用 Backbone.js](docs/modern-java-zh/ch10.md)
+ [Java 设计模式最佳实践](docs/design-pattern-best-prac-java/README.md)
+ [零、前言](docs/design-pattern-best-prac-java/0.md)
+ [一、从面向对象到函数式编程](docs/design-pattern-best-prac-java/1.md)
+ [二、创建型模式](docs/design-pattern-best-prac-java/2.md)
+ [三、行为模式](docs/design-pattern-best-prac-java/3.md)
+ [四、结构模式](docs/design-pattern-best-prac-java/4.md)
+ [五、函数式模式](docs/design-pattern-best-prac-java/5.md)
+ [六、让我们开始反应式吧](docs/design-pattern-best-prac-java/6.md)
+ [七、反应式设计模式](docs/design-pattern-best-prac-java/7.md)
+ [八、应用架构的发展趋势](docs/design-pattern-best-prac-java/8.md)
+ [九、Java 最佳实践](docs/design-pattern-best-prac-java/9.md)
+ [Java 编程问题](docs/java-coding-prob/README.md)
+ [零、前言](docs/java-coding-prob/00.md)
+ [一、字符串、数字和数学](docs/java-coding-prob/01.md)
+ [二、对象、不变性和`switch`表达式](docs/java-coding-prob/02.md)
+ [三、使用日期和时间](docs/java-coding-prob/03.md)
+ [四、类型推断](docs/java-coding-prob/04.md)
+ [五、数组、集合和数据结构](docs/java-coding-prob/05.md)
+ [六、Java I/O 路径、文件、缓冲区、扫描和格式化](docs/java-coding-prob/06.md)
+ [七、Java 反射类、接口、构造器、方法和字段](docs/java-coding-prob/07.md)
+ [八、函数式编程-基础和设计模式](docs/java-coding-prob/08.md)
+ [九、函数式编程——深入研究](docs/java-coding-prob/09.md)
+ [十、并发-线程池、可调用对象和同步器](docs/java-coding-prob/10.md)
+ [十一、并发-深入探索](docs/java-coding-prob/11.md)
+ [十二、`Optional`](docs/java-coding-prob/12.md)
+ [十三、HTTP 客户端和 WebSocket API](docs/java-coding-prob/13.md)
+ [Java 项目大全](docs/java-proj/README.md)
+ [零、前言](docs/java-proj/0.md)
+ [一、Java11 入门](docs/java-proj/1.md)
+ [二、第一个真正的 Java 程序-排序名称](docs/java-proj/2.md)
+ [三、优化排序代码](docs/java-proj/3.md)
+ [四、Mastermind-创造游戏](docs/java-proj/4.md)
+ [五、扩展游戏-跑得并行,跑得更快](docs/java-proj/5.md)
+ [六、使我们的游戏专业化-将其作为 Web 应用](docs/java-proj/6.md)
+ [七、使用 REST 构建商业 Web 应用](docs/java-proj/7.md)
+ [八、扩展我们的电子商务应用](docs/java-proj/8.md)
+ [九、使用反应式编程构建会计应用](docs/java-proj/9.md)
+ [Java 12 编程学习手册](docs/learn-java12-prog/README.md)
+ [零、前言](docs/learn-java12-prog/00.md)
+ [第 1 节:Java 编程概述](docs/learn-java12-prog/sec1.md)
+ [一、Java12 入门](docs/learn-java12-prog/01.md)
+ [二、Java 面向对象编程(OOP)](docs/learn-java12-prog/02.md)
+ [三、Java 基础](docs/learn-java12-prog/03.md)
+ [第 2 节:Java 的构建块](docs/learn-java12-prog/sec2.md)
+ [四、异常处理](docs/learn-java12-prog/04.md)
+ [五、字符串、输入/输出和文件](docs/learn-java12-prog/05.md)
+ [六、数据结构、泛型和流行工具](docs/learn-java12-prog/06.md)
+ [七、Java 标准和外部库](docs/learn-java12-prog/07.md)
+ [八、多线程和并发处理](docs/learn-java12-prog/08.md)
+ [九、JVM 结构与垃圾收集](docs/learn-java12-prog/09.md)
+ [十、管理数据库中的数据](docs/learn-java12-prog/10.md)
+ [十一、网络编程](docs/learn-java12-prog/11.md)
+ [十二、Java GUI 编程](docs/learn-java12-prog/12.md)
+ [第 3 节:高级 Java](docs/learn-java12-prog/sec3.md)
+ [十三、函数式程序设计](docs/learn-java12-prog/13.md)
+ [十四、Java 标准流](docs/learn-java12-prog/14.md)
+ [十五、反应式程序设计](docs/learn-java12-prog/15.md)
+ [十六、微服务](docs/learn-java12-prog/16.md)
+ [十七、Java 微基准线束](docs/learn-java12-prog/17.md)
+ [十八、编写高质量代码的最佳实践](docs/learn-java12-prog/18.md)
+ [十九、Java 新特性](docs/learn-java12-prog/19.md)
+ [二十、答案](docs/learn-java12-prog/20.md)
+ [精通 Java 11](docs/master-java11/README.md)
+ [零、前言](docs/master-java11/00.md)
+ [一、Java11 环境](docs/master-java11/01.md)
+ [二、探索 Java11](docs/master-java11/02.md)
+ [三、Java11 基础](docs/master-java11/03.md)
+ [四、用 Java11 构建模块化应用](docs/master-java11/04.md)
+ [五、将应用迁移到 Java11](docs/master-java11/05.md)
+ [六、试用 Java Shell](docs/master-java11/06.md)
+ [七、利用默认的 G1 垃圾收集器](docs/master-java11/07.md)
+ [八、JMH 的微基准应用](docs/master-java11/08.md)
+ [九、利用进程 API](docs/master-java11/09.md)
+ [十、细粒度栈跟踪](docs/master-java11/10.md)
+ [十一、新工具和工具增强功能](docs/master-java11/11.md)
+ [十二、并发性增强](docs/master-java11/12.md)
+ [十三、安全增强功能](docs/master-java11/13.md)
+ [十四、命令行标志](docs/master-java11/14.md)
+ [十五、Java 平台的其他增强功能](docs/master-java11/15.md)
+ [十六、未来发展方向](docs/master-java11/16.md)
+ [十七、为 Java 平台做贡献](docs/master-java11/17.md)
+ [十八、答案](docs/master-java11/18.md)
# 前言
# 零、前言
拥有设计模式的知识可以帮助开发人员改进代码库,促进代码重用,并使架构更加健壮。随着语言的发展,新特性在被大量采用之前需要时间才能被完全理解。这本书的任务是简化最新趋势的采用,并为程序员提供良好的实践。
......
# 从面向对象到函数式编程
# 一、从面向对象到函数式编程
本章的目的是向读者介绍使用设计模式和 Java 中可用的最新特性编写健壮、可维护和可扩展代码的基本概念。为了实现我们的目标,我们将讨论以下主题:
......@@ -191,7 +191,7 @@ IntStream
.forEach( System.out::print );
```
流在`java.util.stream`包中定义,用于管理可以执行功能样式操作的对象流。流是集合的功能对应者,为映射和归约操作提供支持。
流在`java.util.stream`包中定义,用于管理可以执行函数式操作的对象流。流是集合的功能对应者,为映射和归约操作提供支持。
我们将在后面的章节中进一步讨论 Java 中的流和函数编程支持。
......@@ -366,7 +366,7 @@ public bool lock(Key key)
应用时,**接口分离原则****ISP**)减少了代码耦合,使软件更健壮,更易于维护和扩展。ISP 最初是由 robertmartin 宣布的,当时他意识到,如果这个原则被打破,客户端被迫依赖于他们不使用的接口,那么代码就变得紧密耦合,几乎不可能为它添加新的功能。
为了更好地理解这一点,让我们再次以汽车服务为例(参见下图)。现在我们需要实现一个名为·Mechanic的类。技工修车,所以我们增加了一种修车方法。在这种情况下,`Mechanic`类依赖于`Car`类。然而,`Car`类比`Mechanic`类需要更多的方法:
为了更好地理解这一点,让我们再次以汽车服务为例(参见下图)。现在我们需要实现一个名为·Mechanic 的类。技工修车,所以我们增加了一种修车方法。在这种情况下,`Mechanic`类依赖于`Car`类。然而,`Car`类比`Mechanic`类需要更多的方法:
![](img/0663ce8b-34f9-42a9-956d-168fa1ce414a.jpg)
......
# 创建型模式
# 二、创建型模式
本章的目的是学习创造模式。创造模式是处理对象创造的模式。在本章中,我们将介绍以下主题:
......
# 行为模式
# 三、行为模式
本章的目的是学习行为模式。行为模式是关注对象交互、通信和控制流的模式。大多数行为模式是基于组合和委托而不是继承的。我们将在本章中了解以下行为模式:
......
# 结构模式
# 四、结构模式
本章的目的是学习结构模式。结构模式是通过利用对象和类之间的关系来创建复杂结构的模式。大多数结构模式都是基于继承的。在本章中,我们将只关注以下 GOF 模式:
......@@ -1003,4 +1003,4 @@ class Location
在本章中,我们学习了 GOF 结构模式。我们查看了它们的描述和意图,并用示例代码说明了它们的用法。我们学习了为什么,何时,以及如何应用它们,同时也研究了它们之间的细微差别。我们还简要介绍了其他鲜为人知的结构模式。
在接下来的章节中,我们将看到这些模式中的一些是如何在功能性和反应式世界中发生变化的。
\ No newline at end of file
在接下来的章节中,我们将看到这些模式中的一些是如何在函数式和反应式世界中发生变化的。
\ No newline at end of file
# 函数式模式
# 五、函数式模式
本章的目的是学习函数模式,以及通过引入函数式编程风格(现在在最重要的编程语言中是可能的)对传统模式所做的更改。Java8 引入了一些功能特性,增加了一个新的抽象级别,影响了我们编写一些面向对象设计模式的方式,甚至使其中一些模式变得无关紧要。在本章中,我们将看到设计模式是如何被新的语言特性所改变,甚至取代的。在他的论文《动态语言中的设计模式》中,Peter Norvig 注意到 23 种设计模式中有 16 种更简单,或者被动态语言中现有的语言特征所取代,比如 Dylan。全文见[这个页面](http://norvig.com/design-patterns/)。在这一章中,我们将看到什么可以被取代,以及新出现的模式是怎样和怎样的。正如 peternorvig 在他的论文中所说的,*很久以前,子程序调用只是一种模式*,随着语言的发展,这些模式会发生变化或被替换。
本章的目的是学习函数模式,以及通过引入函数式编程风格(现在在最重要的编程语言中是可能的)对传统模式所做的更改。Java8 引入了一些函数式特性,增加了一个新的抽象级别,影响了我们编写一些面向对象设计模式的方式,甚至使其中一些模式变得无关紧要。在本章中,我们将看到设计模式是如何被新的语言特性所改变,甚至取代的。在他的论文《动态语言中的设计模式》中,Peter Norvig 注意到 23 种设计模式中有 16 种更简单,或者被动态语言中现有的语言特征所取代,比如 Dylan。全文见[这个页面](http://norvig.com/design-patterns/)。在这一章中,我们将看到什么可以被取代,以及新出现的模式是怎样和怎样的。正如 peternorvig 在他的论文中所说的,*很久以前,子程序调用只是一种模式*,随着语言的发展,这些模式会发生变化或被替换。
为了运行本章中的代码,我们使用了 Java 中可用的 JShell REPL 工具,可以从 Windows 中的`$JAVA_HOME/bin/jshell on Linux or %JAVA_HOME%/bin/jshell.exe`访问该工具。
......@@ -143,7 +143,7 @@ jshell> add100.apply(9);
$40 ==> 110
```
在这里,我们期望得到 109,但是它用 110 回答,这是正确的(101 加 9 等于 110);我们的`a`变量从 100 变为 101。闭包需要谨慎使用,而且,根据经验,使用`final`关键字来限制更改。闭包并不总是有害的;在我们想要共享当前状态的情况下(并且在需要的时候能够修改它),闭包非常方便。例如,我们将在需要提供数据库连接(抽象连接)的回调的 API 中使用闭包;我们将使用不同的闭包,每个闭包提供基于特定数据库提供程序设置的连接,通常从外部上下文中已知的属性文件读取。它可以用函数的方式实现模板模式。
在这里,我们期望得到 109,但是它用 110 回答,这是正确的(101 加 9 等于 110);我们的`a`变量从 100 变为 101。闭包需要谨慎使用,而且,根据经验,使用`final`关键字来限制更改。闭包并不总是有害的;在我们想要共享当前状态的情况下(并且在需要的时候能够修改它),闭包非常方便。例如,我们将在需要提供数据库连接(抽象连接)的回调的 API 中使用闭包;我们将使用不同的闭包,每个闭包提供基于特定数据库供应商设置的连接,通常从外部上下文中已知的属性文件读取。它可以用函数的方式实现模板模式。
# 不变性
......@@ -197,7 +197,7 @@ $6 ==> Optional[Hello Applicatives]
# 单子
**单子**应用一个函数,将一个包装值返回给一个包装值。Java 包含了`Stream``CompletableFuture`和已经出现的`Optional`等示例。`flatMap`函数通过将给定的函数应用于邮政编码地图中可能存在或不存在的邮政编码列表来实现这一点,如下代码所示:
**单子**应用一个函数,将一个包装值返回给一个包装值。Java 包含了`Stream``CompletableFuture`和已经出现的`Optional`等示例。`flatMap`函数通过将给定的函数应用于邮政编码映射中可能存在或不存在的邮政编码列表来实现这一点,如下代码所示:
```java
jshell> Map<Integer, String> codesMapping = Map.of(400500, "Cluj-Napoca", 75001, "Paris", 10115, "Berlin", 10000, "New York")
......@@ -216,7 +216,7 @@ Haskell 使用以下单子(在其他函数式编程语言中导入)。它们
* 写入器单子用于将状态附加到多个写入器,非常类似于记录到多个写入器(控制台/文件/网络)的日志过程。
* 状态单子既是读取器又是写入器。
为了掌握函子、应用和单子的概念,我们建议您查阅[这个页面](http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html)[这个页面](https://bartoszmilewski.com/2011/01/09/monads-for-the-curious-programmer-part-1/)。在[这个页面](https://github.com/aol/cyclops-react)剑水蚤反应图书馆里也有一些功能性的好东西。
为了掌握函子、应用和单子的概念,我们建议您查阅[这个页面](http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html)[这个页面](https://bartoszmilewski.com/2011/01/09/monads-for-the-curious-programmer-part-1/)。在[这个页面](https://github.com/aol/cyclops-react) Cyclops React 库里也有一些函数式的好东西。
# Java 函数式编程简介
......@@ -413,7 +413,7 @@ Lombock 库将生成器作为其功能的一部分引入。只要使用`@Builder
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
```
其他 Java8 之前的实现使用反射来创建通用生成器。Java8+ 泛型构建器版本可以通过利用供应`BiConsumer`组合来实现,如下代码所示:
其他 Java8 之前的实现使用反射来创建通用生成器。Java8+ 泛型构建器版本可以通过利用供应`BiConsumer`组合来实现,如下代码所示:
```java
jshell> class Person { private String name;
......@@ -664,7 +664,7 @@ Execute statement...
# 尾部调用优化
**尾部调用优化****TCO**)是一些编译器在不使用栈空间的情况下调用函数的技术。Scala 通过用`@tailrec`注解递归代码来利用它。这基本上告诉编译器使用一个特殊的循环,称为 trampoline,它反复运行函数。函数调用可以处于一种或多种要调用的状态。在完成时,它返回结果(头部),在更多的情况下,它返回当前循环而不返回头部(尾部)。这个模式已经被cyclops-react提供给我们了。
**尾部调用优化****TCO**)是一些编译器在不使用栈空间的情况下调用函数的技术。Scala 通过用`@tailrec`注解递归代码来利用它。这基本上告诉编译器使用一个特殊的循环,称为 trampoline,它反复运行函数。函数调用可以处于一种或多种要调用的状态。在完成时,它返回结果(头部),在更多的情况下,它返回当前循环而不返回头部(尾部)。这个模式已经被 cyclops-react 提供给我们了。
# 意图
......
# 让我们开始反应式吧
# 六、让我们开始反应式吧
这一章将描述反应式编程范式,以及为什么它能很好地适用于带有函数元素的语言。读者将熟悉反应式编程背后的概念。我们将介绍在创建反应式应用时从观察者模式和迭代器模式中使用的元素。这些示例将使用反应式框架和名为 **RxJava**(版本 2.0)的 Java 实现。
......@@ -119,7 +119,7 @@ RxJavaJar 是根据 Apache 软件许可证 2.0 版获得许可的,可以在中
![](img/fd64466a-2b93-43ce-9fe2-a4fc81f8dd59.png)
现在我们已经成功地创建了我们的第一个可观察到的。在下面的部分中,我们将学习它的功能以及如何使用它。
现在我们已经成功地创建了我们的第一个可观察对象。在下面的部分中,我们将学习它的功能以及如何使用它。
# 可观察对象、可流动对象、观察者和订阅者
......@@ -450,7 +450,7 @@ RxJava `Observable`应用于小数据集(最长不超过 1000 个元素),
这些运算符可以通过继续执行以下顺序从错误中恢复:
* `onErrorResumeNext`:指示一个可观察对象将控制权传递给供应提供的另一个可观察对象,而不是在出现问题时调用`onError`
* `onErrorResumeNext`:指示一个可观察对象将控制权传递给供应提供的另一个可观察对象,而不是在出现问题时调用`onError`
* `onErrorReturn`:指示可观察对象发出函数提供的默认值,以防出现错误
* `onErrorReturnItem`:指示可观察对象发出提供的缺省值,以防出现错误
* `onExceptionResumeNext`:指示一个可观察对象将控制传递给另一个可观察对象,而不是在出现问题时调用`onError`
......
# 反应式设计模式
# 七、反应式设计模式
在最后一章中,我们讨论了反应式编程风格,并强调了进行反应式编程的重要性。在本章中,我们将逐一回顾反应式编程的四大支柱,即响应性、弹性、弹性和消息驱动,并了解实现这些支柱的各种模式。本章将介绍以下主题:
......
# 应用架构的发展趋势
# 八、应用架构的发展趋势
每当我们开始开发一个应用时,我们首先需要确定的是我们将要使用的设计或架构。随着软件行业在过去几十年的成熟,我们用来设计系统的方式也发生了变化。在本章中,我们将讨论我们在最近的过去看到的一些重要的架构趋势,这些趋势至今仍然相关。我们将尝试分析这些架构模式的好、坏和丑,并找出哪种模式能够解决哪种类型的问题。本章将介绍以下主题:
......
# Java 最佳实践
# 九、Java 最佳实践
在本章中,我们将讨论 Java9 和 Java10 中的最佳实践。Java 从 1995 年发布的版本 1.0 到最近的版本 Java10 已经有了很大的发展。我们将快速了解 Java 从一开始到今天的发展历程,但我们将更多地关注 Java9 和 Java10 带来的最新变化。
......@@ -28,7 +28,7 @@ Java5 引入了泛型。在泛型之前,许多数据结构(如列表和映
Java5 带来的另一个重要特性是自动装箱,它有助于原始类型类和相应的包装类之间的转换。枚举也在 Java5 中获得了新的生命。它们不仅可以保持常量值,还可以保持数据和行为。
方法采用可变参数。如果元素属于同一类型,则不再强制您提供元素的确切数目。例如,您可以简单地编写`stringMethod(String... str)`并将任意数量的字符串传递给此方法。Java5 还引入了注释,这些注释在以后的版本中得到了增强,并成为许多框架的一个组成部分。
方法采用可变参数。如果元素属于同一类型,则不再强制您提供元素的确切数目。例如,您可以简单地编写`stringMethod(String... str)`并将任意数量的字符串传递给此方法。Java5 还引入了注解,这些注解在以后的版本中得到了增强,并成为许多框架的一个组成部分。
Java5 中还有许多其他增强功能,这使得该版本成为 Java 历史上的一个重要时刻。
......
# Java 设计模式最佳实践
> 原文:[Design Patterns and Best Practices in Java](https://libgen.rs/book/index.php?md5=096AE07A3FFC0E5B9926B8DE68424560)
>
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
>
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
>
> 我知道,这个世界,每天都有太多遗憾,所以你好,再见。——宋冬野《安和桥》
* [在线阅读](https://java.apachecn.org)
* [ApacheCN 面试求职交流群 724187166](https://jq.qq.com/?_wv=1027&k=54ujcL3)
* [ApacheCN 学习资源](http://www.apachecn.org/)
## 贡献指南
本项目需要校对,欢迎大家提交 Pull Request。
> 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百科)
## 联系方式
### 负责人
* [飞龙](https://github.com/wizardforcel): 562826179
### 其他
* 在我们的 [apachecn/apachecn-java-zh](https://github.com/apachecn/apachecn-java-zh) github 上提 issue.
* 发邮件到 Email: `apachecn@163.com`.
* 在我们的 [组织学习交流群](http://www.apachecn.org/organization/348.html) 中联系群主/管理员即可.
## 赞助我们
![](http://data.apachecn.org/img/about/donate.jpg)
+ [Java 设计模式最佳实践](README.md)
+ [零、前言](0.md)
+ [一、从面向对象到函数式编程](1.md)
+ [二、创建型模式](2.md)
+ [三、行为模式](3.md)
+ [四、结构模式](4.md)
+ [五、函数式模式](5.md)
+ [六、让我们开始反应式吧](6.md)
+ [七、反应式设计模式](7.md)
+ [八、应用架构的发展趋势](8.md)
+ [九、Java 最佳实践](9.md)
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。