2k 2 分钟

# 简介 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 ** 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。** 一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 #...
1.2k 1 分钟

# 简介 举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 适配器模式将一个类的接口转换成用户希望的另一个接口,它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 # 实现 鸭子 (Duck) 和火鸡 (Turkey) 拥有不同的叫声,Duck 的叫声调用 quack () 方法,而 Turkey 调用 gobble () 方法。 要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子! 接口: public interface Duck...
2.4k 2 分钟

# 简介 一般应用,都是读多写少, ReentrantReadWriteLock 因读写互斥,故读时阻塞写,因而性能上上不去。可能会使写线程饥饿, StampedLock 营运而生。 ``StampedLock 并没有使用 AQS , API 相对复杂,内壁实现比 ReentrantReadWriteLock 复杂得多,所以本文就不对源码进行过多解释。有点就是吞吐量相对 ReentrantReadWriteLock` 有显著提升。 # 原理 获取锁的方法都会返回一个邮戳 Stamp , Stamp=0 表示获取失败,其余都表示成功。释放锁时,也需要一个邮戳 Stamp ,这个 Stamp...
1.5k 1 分钟

# 泛型简介 泛型是 Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。理解 Java 泛型最简单的方法是把它看成一种便捷语法,能节省你某些 Java 类型转换 (casting) 上的操作。 // 有泛型List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple = box.get(0);// 没有泛型Apple apple =...
3.1k 3 分钟

# Java5 的注解 注解就相当于一种标记,在程序中加了注解就等于为程序加了某种标记。告诉 javac 编译器或者 java 开发工具…… 向其传递某种信息,作为一个标记。 同时注解分为三个阶段(注解的生命周期): java 源文件 --> class 文件 --> 内存中的字节码。由元注解 Retention 决定,注解的默认阶段是 Class 。 注解 阶段 @Retention(RetentionPolicy.SOURCE) 源文件 @Retention(RetentionPolicy.CLASS) class...
1.9k 2 分钟

# 简介 接口可以有实现方法,而且不需要实现类实现其方法,只需要在方法名前加上 default 关键字。 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在 JDK...
2.7k 2 分钟

# 简介 Optional 类的引入很好的解决空指针异常。它是一个可以为 null 的容器对象, Optional 本身没有引入新技术,你可以把它看作对象的包装类,通过将对象封装在 Optional 中,可以省去大量空指针检查。 相关的方法可以快速阅读菜鸟教程。这里大致提一些相关的行为: 获取 Optional 里的值,如果该值为空,返回默认值(可以指定默认值,有点像 HashMap 中的 getOrDefault ) 检测 Optional 里的值,( ifPresent 方法接收 Consumer 接口,来对值进行操作) 构造器私有,通过其他方法(静态)检测要构造对象所传入的对象是否为...
2.6k 2 分钟

# 简介 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。 以下是 lambda 表达式的重要特征: ** 可选类型声明:** 不需要声明参数类型,编译器可以统一识别参数值。 ** 可选的参数圆括号:** 一个参数无需定义圆括号,但多个参数需要定义圆括号。 ** 可选的大括号:** 如果主体包含了一个语句,就不需要使用大括号。 ** 可选的返回关键字:** 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。 具体代码为 // 1. 不需要参数,返回值为 5 () -> 5...
674 1 分钟

# 简介 一个抽象类公开定义了执行它的方法的方式 / 模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 关键代码框架在抽象类中实现,其他步骤在子类实现。模板方法需要加上 final 防止被重写。要注意的是,子类要重写的不是模板方法,而是子类需要重写的方法。抽象类可以通过模板方法来规定一整套行为流程,但是流程中各个行为可以由子类自己实现。 public abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay();...
5.4k 5 分钟

# 前言 关于 gawk 进阶,你可以参考这篇博客,很详细,但是请一定要看本文的结束语 gawk 进阶。 # 内建变量 gawk 程序使用内建变量来引用程序的数据里的一些特殊功能。 # 字段和记录分隔符的变量 类似于 $1,$2 是数据字段变量,其根据字段分隔符来划定,默认情况下,字段分隔符是空白字符 (空格或制表符)。可以使用内建变量 FS 更改字段分隔符( shell 脚本里面用的是 IFS ) FIELDWIDTHS--由空格分隔的一列数字,定义了每个数据字段确切宽度FS--输入字段之间分隔符OFS--输出字段之间分隔符RS--输入记录分隔符ORS--输出记录分隔符默认情况下,...