mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-01 03:23:42 +00:00
Update 设计模式 - 装饰.md
调整类图说明的排版分段,补充装饰与代理模式的区别及 JDK 中 I/O 装饰用法的示例说明,并完成参考文献的文字校对。
This commit is contained in:
+10
-2
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user