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.