From 07bc0766603076c5df9da5c0679a3670209bbcc6 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Fri, 30 Oct 2026 20:19:44 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=20-=20=E6=A8=A1=E6=9D=BF=E6=96=B9=E6=B3=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充模板方法与策略模式的对比说明,更新 JDK 中关于 InputStream 与 AQS 的应用示例,并完成参考资料的文字校对。 --- notes/设计模式 - 模板方法.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/notes/设计模式 - 模板方法.md b/notes/设计模式 - 模板方法.md index 80dad995..c1143daf 100644 --- a/notes/设计模式 - 模板方法.md +++ b/notes/设计模式 - 模板方法.md @@ -89,8 +89,13 @@ pourInCup Tea.addCondiments ``` +prepareRecipe() 用 final 修饰,子类不能改变步骤和顺序,必须实现的只有 brew() 和 addCondiments() 这两个抽象步骤。 + +模板方法通过继承固定流程、替换其中的步骤,[策略](设计模式%20-%20策略.md)通过组合替换整个算法。 + ### JDK 中的应用 -- java.util.Collections#sort() +InputStream#read(byte[], int, int) 是一个模板方法:它循环调用抽象的 read() 逐个读取字节,子类只实现读一个字节的 read() 就能批量读取。AQS(AbstractQueuedSynchronizer)也是这样:acquire() 固定了获取失败后排队、挂起的流程,子类(例如 ReentrantLock 内部的 FairSync、NonfairSync)只实现 tryAcquire(),见 [AQS](Java%20并发.md#七juc---aqs)。 + - java.io.InputStream#skip() - java.io.InputStream#read(byte[], int, int) - java.util.AbstractList#indexOf() @@ -98,4 +103,4 @@ Tea.addCondiments ## 参考资料 - 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007. -- Gamma E. 设计模式: 可复用面向对象软件的基础 [M]. 机械工业出版社, 2007. +- Gamma E. 设计模式:可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.