目录:
- 什么是装饰模式
- 为什么要有装饰模式
- 如何实现一个装饰模式
什么是装饰模式
为了增强一个类我们通常的做法是继承它,并对其功能扩展。但这种方式在原始类拥有较多子类时,会引发继承链路过于复杂,导致难以维护。
在JKD IO中,为了避免继承链路复杂的情况,使用了装饰模式。
如InputStream的实现类FilterInputStream,它的增强类BufferedInputStream并不是单单的继承FilterInputStream对其增强,而是在函数中使用InputStream入参达到使用复合来增强FilterInputStream。
1 InputStream in = new FileInputStream("/test.txt"); 2 InputStream bin = new BufferedInputStream(in); 3 byte[] data = new byte[128]; 4 while (bin.read(data) != -1) { 5 // dosomething 6 }
终上所述,装饰模式就是不改变原始类(被装饰类)代码结构,而进行相关功能增强的一种设计模式。
它和代理模式非常的向,但装饰模式解决的问题是原始类的相关功能扩展,而代理模式解决的是非相关功能扩展。
为什么要有装饰模式
解决继承链路过于复杂的增强模式。
如何实现一个装饰模式
1 // 装饰器模式的代码结构(下面的接口也可以替换成抽象类) 2 public interface IA { 3 void f(); 4 } 5 6 public class A impelements IA { 7 public void f() { //... } 8 } 9 10 public class ADecorator impements IA { 11 private IA a; 12 public ADecorator(IA a) { 13 this.a = a; 14 } 15 16 public void f() { 17 // 功能增强代码 18 a.f(); 19 // 功能增强代码 20 } 21 }