From f318bc922c89679649ce5c83184cefb3ce45630f Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Fri, 30 Oct 2026 20:19:45 +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=E8=A3=85=E9=A5=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整类图说明的排版分段,补充装饰与代理模式的区别及 JDK 中 I/O 装饰用法的示例说明,并完成参考文献的文字校对。 --- notes/设计模式 - 装饰.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/notes/设计模式 - 装饰.md b/notes/设计模式 - 装饰.md index 56e26a9c..28817446 100644 --- a/notes/设计模式 - 装饰.md +++ b/notes/设计模式 - 装饰.md @@ -4,7 +4,11 @@ 为对象动态添加功能。 ### 类图 -装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。 +装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。 + +所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。 + +具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。

@@ -89,6 +93,8 @@ public class Client { 3.0 ``` +装饰与[代理](设计模式%20-%20代理.md)的结构相似,区别在于目的:装饰为对象叠加功能,代理控制对对象的访问。 + ### 设计原则 类应该对扩展开放,对修改关闭:也就是添加新功能时不需要修改代码。饮料可以动态添加新的配料,而不需要去修改饮料的代码。 @@ -96,6 +102,8 @@ public class Client { 不可能把所有的类设计成都满足这一原则,应当把该原则应用于最有可能发生改变的地方。 ### JDK 中的应用 +Java I/O 是装饰的典型用法,例如 new BufferedInputStream(new FileInputStream("a.txt")) 给文件流加上缓冲,再套一层 DataInputStream 就能按 int、long 读取。 + - java.io.BufferedInputStream(InputStream) - java.io.DataInputStream(InputStream) - java.io.BufferedOutputStream(OutputStream) @@ -105,4 +113,4 @@ public class Client { ## 参考资料 - 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007. -- Gamma E. 设计模式: 可复用面向对象软件的基础 [M]. 机械工业出版社, 2007. +- Gamma E. 设计模式:可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.