设计模式学习笔记(四、结构型-装饰模式)

目录:

  • 什么是装饰模式
  • 为什么要有装饰模式
  • 如何实现一个装饰模式

什么是装饰模式

为了增强一个类我们通常的做法是继承它,并对其功能扩展。但这种方式在原始类拥有较多子类时,会引发继承链路过于复杂,导致难以维护。

在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 }
posted @ 2020-04-08 21:26  被猪附身的人  阅读(131)  评论(0编辑  收藏  举报