Update 设计模式 - 装饰.md

调整类图说明的排版分段,补充装饰与代理模式的区别及 JDK 中 I/O 装饰用法的示例说明,并完成参考文献的文字校对。
This commit is contained in:
CyC2018
2026-10-30 20:19:45 +08:00
parent 30be911b3b
commit f318bc922c
+10 -2
View File
@@ -4,7 +4,11 @@
为对象动态添加功能。
### 类图
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。
所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。
具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
<div align="center"> <img src="pics/dp-decorator.png" width="760px"/> </div><br>
@@ -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.