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. IPython的使用技巧

    ?打印IPython简介 在IPython中直接输入?,可以打印出IPython的功能介绍 object ?内省功能 在变量后面加上?,可以打印出该变量的详细信息.例如图中一个列表对象,打印出该对象的 ...

  2. vue-项目的整体增删改查

    Dept: package com.example.demo.gs; public class Dept { private int id; private String name; private ...

  3. NC 使用Nginx实现https的反向代理

    summary: [通过Nginx实现NCC的https访问,并解决UClient应用的问题] 1 概述 通过Nginx 安装配置反向代理,实现NC.NCC的https访问. 本文以NCC2005为例 ...

  4. 【题解】P7860 [COCI2015-2016#2] ARTUR

    题面传送门 好题. 主要思路和另一位巨佬差不多,详细讲一下判断的部分. 解决思路: 首先考虑本题与拓扑排序有和关系.可以想到,某些棍子的先后移动顺序是有限制的.比如: 这里红色的必须比蓝色的先移动,因 ...

  5. python学习——查找计算机中的文件

    # import os # # path = 'C:/Users/admin/Desktop/images' # files = os.listdir(path) # # for f in files ...

  6. .NET跨平台框架选择之一 - Avalonia UI

    本文阅读目录 1. Avalonia UI简介 Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行, ...

  7. Python-OpenCV的安装及学习资料

    Conda环境安装 OpenCV pip install opencv-python opencv-contrib-python -i https://mirrors.aliyun.com/pypi/ ...

  8. 把Mybatis Generator生成的代码加上想要的注释

    作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件.但是Mybatis Generator默认生成的代码中,注释并不是我 ...

  9. 进军东南亚市场,腾讯云数据库 TDSQL 助力印尼 BNC 银行数字化转型

    腾讯云数据库在助力金融核心系统分布式替换上,已经辐射到了东南亚市场. 东南亚最大的银行之一印尼BNC银行(Bank Neo Commerce)已正式完成新核心分布式迁移,使用腾讯云数据库TDSQL后, ...

  10. node学习01

    1.前言 Node.js 是一个开源和跨平台的 JavaScript 运行时环境 Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核). 这使得 N ...