1. SOLID原则

1.1. 开发良好面向对象程序的准则

1.2. Liskov substitution里氏替换

1.3. Interface segregation接口隔离

1.4. Single responsibility单一功能原则

1.4.1. 程序中的类或方法只能有一个改变的理由

1.4.2. 一个类不仅要功能单一,而且还需将功能封装好

1.5. Open/closed开闭原则

1.5.1. 软件应该对扩展开放,对修改闭合

1.5.1.1. 让软件易于修改

1.5.2. 高阶函数在用多态来实现开闭原则

1.5.3. 使用不可变对象实现开闭原则

1.6. Dependency inversion依赖反转原则

1.6.1. 抽象不应依赖细节,细节应该依赖抽象

1.6.1.1. 待依赖的抽象不必是接口

1.6.2. 让程序员脱离底层粘合代码,编写上层业务逻辑代码

1.6.3. 高阶函数提供了反转控制

1.6.4. 模块化和重用方式是双向的

1.6.4.1. 可以替换不同的细节重用上层代码

1.6.4.2. 可以替换不同的业务逻辑重用细节的实现

2. 不可变性

2.1. 观测不可变性

2.1.1. 在其他对象看来,该类是不可变的

2.1.2. java.lang.String

2.1.2.1. 第一次调用hashCode方法时缓存了生成的散列值

2.1.3. 观测不可变性不意味着实现不可变性

2.2. 实现不可变性

2.2.1. 对象本身不可变

2.2.2. 实现不可变性意味着观测不可变性

3. 设计模式

3.1. 有些模式会变得过时

3.2. Lambda能让很多现有设计模式更简单、可读性更强

3.2.1. 将大量代码塞进一个方法会让可读性变差是决定如何使用Lambda表达式的黄金法则

4. 单例模式

4.1. 应该避免使用的模式

4.2. 敏捷开发使其成了一个反模式

5. 命令者模式

5.1. 命令者是一个对象,它封装了调用另一个方法的所有细节

5.2. 使用该对象,可以编写出根据运行期条件,顺序调用方法的一般化代码

5.3. 函数接口Runnable

5.4. 宏只是使用命令者模式的一个例子,它被大量用在实现组件化的图形界面系统、撤销功能、线程池、事务和向导中

5.5. 使用Lambda表达式或是方法引用,能让代码更简洁,去除了大量样板代码,让代码意图更加明显

6. 策略模式

6.1. 能在运行时改变软件的算法行为

6.2. 定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后

6.3. 使用Lambda表达式或者方法引用可以去掉样板代码

7. 观察者模式

7.1. 可被Lambda表达式简化和改进的行为模式

7.2. 被观察者持有一个观察者列表。当被观察者的状态发生改变,会通知观察者。

7.3. 观察者模式被大量应用于基于MVC的GUI工具中,以此让模型状态发生变化时,自动刷新视图模块,达到二者之间的解耦

8. 模板方法模式

8.1. 整体算法的设计是一个抽象类,它有一系列抽象方法,代表算法中可被定制的步骤,同时这个类中包含了一些通用代码

8.2. 算法的每一个变种由具体的类实现,它们重写了抽象方法,提供了相应的实现

8.3. 将一组方法调用按一定顺序组织起来

8.4. 如果用函数接口表示函数,用Lambda表达式或者方法引用实现这些接口,相比使用继承构建算法,就会得到极大的灵活性

8.4.1. 使用函数接口实现方法并没有排除继承的方式

9. 领域专用语言(DSL)

9.1. 针对软件系统中某特定部分的编程语言

9.1.1. 比较小巧

9.1.2. 表达能力也不如通用语言强

9.1.3. 不求面面俱到,但求有所专长

9.2. Domain-Specific Languages

9.2.1. Martin Fowler和Rebecca Parsons合著

9.2.2. Addison-Wesley出版社出版

9.3. 外部DSL

9.3.1. 脱离程序源码编写,然后单独解析和实现

9.3.2. 例如

9.3.2.1. 级联样式表(CSS)

9.3.2.2. 正则表达式

9.4. 内部DSL

9.4.1. 嵌入编写它们的编程语言中

9.4.2. 普通的类库,提供API方便使用

9.4.3. 例如

9.4.3.1. JMock

9.4.3.2. Mockito

9.4.3.3. JOOQ

9.4.3.4. Querydsl

10. 行为驱动开发(BDD)

10.1. 测试驱动开发(TDD)的一个变种

10.2. 它的重点是描述程序的行为,而非一组需要通过的单元测试

读Java8函数式编程笔记07_设计和架构的原则的更多相关文章

  1. 关于Java8函数式编程你需要了解的几点

    函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...

  2. Java8函数式编程探秘

    引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...

  3. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  4. Java8 函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  5. 重识Java8函数式编程

    前言 最近真的是太忙忙忙忙忙了,很久没有更新文章了.最近工作中看到了几段关于函数式编程的代码,但是有点费解,于是就准备总结一下函数式编程.很多东西很简单,但是如果不总结,可能会被它的各种变体所困扰.接 ...

  6. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  7. java8函数式编程(转载)

    1. 概述 1.1 函数式编程简介 我们最常用的面向对象编程(Java)属于命令式编程(Imperative Programming)这种编程范式.常见的编程范式还有逻辑式编程(Logic Progr ...

  8. 漫漫人生路,学点Jakarta基础-Java8函数式编程

    接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...

  9. Java8函数式编程的宏观总结

    1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...

  10. java8函数式编程实例

    什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...

随机推荐

  1. 在CentOS7下安装Oracle11教程

    前言 安装oracle时,发现网上的文章总是缺少一些信息,导致安装不顺利,因为我对一些文章进行了整合,用以备忘. Oracle安装 首先下载linux版本的oracle安装文件,然后通过XFTP上传到 ...

  2. Python基础之模块:1、模块的导入和使用

    目录 一.模块 1.简介 2.模块的表现形式 二.模块的分类 1.自定义模块 2.内置模块 3.第三方模块 三.导入模块的句式 学前须知: 1.import句式 2.from...import...句 ...

  3. JS学习笔记 (四) 数组进阶

    1.基本知识 1.数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中的位置称为索引,以数字表示,以0开始. 2.数组是无类型的.数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的 ...

  4. Go语言核心36讲36

    在前面,我几乎已经把Go语言自带的同步工具全盘托出了.你是否已经听懂了会用了呢? 无论怎样,我都希望你能够多多练习.多多使用.它们和Go语言独有的并发编程方式并不冲突,相反,配合起来使用,绝对能达到& ...

  5. sql注入的一丢丢

  6. C++编程笔记(QT)

    目录 入门基础 模态对话框 消息提示框(messagebox) 文件和目录 字体选择框 输入对话框 进度条 工具栏 控件布局 Windows托盘案例 控件 button 下拉菜单按钮 `radioBu ...

  7. Golang反射获得变量类型和值

    1. 什么是反射 反射是程序在运行期间获取变量的类型和值.或者执行变量的方法的能力. Golang反射包中有两对非常重要的函数和类型,两个函数分别是: reflect.TypeOf 能获取类型信息re ...

  8. MySQL进阶实战6,缓存表、视图、计数器表

    一.缓存表和汇总表 有时提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时候还需要创建一张完全独立的汇总表或缓存表. 缓存表用来存储那些获取很简单,但速度较慢的数据: 汇总表用来保存使用grou ...

  9. 【sqoop】简介、原理、安装配置测试、导入导出案例、脚本打包、常见命令及参数介绍、常用命令举例

    一.sqoop简介 用于在Hadoop(Hive)与传统的数据库(mysql.oracle...)之间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等 ...

  10. Vue中关于数组与对象修改触发页面更新的机制与原理简析

    Vue中关于数组与对象修改触发页面更新的机制与原理简析 相关问题 数组 使用索引直接赋值与直接修改数组length时,不会触发页面更新. 例如: <script> export defau ...