Java设计模式(学习整理)----装饰模式
1、概念:
(在我看来,模式就像是是一种思想,在这种思想的指引下,对代码和结构的一番加工和整合而已!都是套路!)
装饰模式又称包装(Wrapper)模式,是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。对客户端透明意味着接口不变。
2、问题:
在OO设计和开发过程中, 经常会遇到下面的情况: 我们需要为已经设计好的类添加新的职责, 通常情况下我们会定义一个新类继承自定义好的类. 由于组合比继承更好(复杂度高,继承深度深等原因,
类图:
3、如何实现装饰:
(1):继承形式:(不推荐)
当我们为已经设计好的类添加新的功能的时候,可以创建一个新的类,继承这个现有的类,并在新的子类中添加新的所需功能!但是这样并不好!每当新的功能出现的时候,都需要新建新的继承子类,
是麻烦了点,并且不怎么符合封装性和松耦合性!
代码说明:
1 /** 2 *假设已经设计好的类如下: 3 */ 4 class OldClass { 5 6 //功能1 7 public void method1(){} 8 9 //功能2 10 public int method2(){} 11 12 }
现在需要添加新的功能:(继承装饰形式)
1 /** 2 *继承装饰形式: 3 */ 4 class NewClass extends OldClass{ 5 6 //原有的功能被继承得到 7 8 //新的功能 9 public void method3(){} 10 }
(2):实现接口形式:(推荐)
由于Java中是单继承,多实现的,所有不推荐使用继承基类来实现增加新的功能,实现接口的话,就可以在原有类的基础上随意添加新的功能,只有写好对应新功能的接口,在实现即可!
好处也很明显,符合松耦合的特性和有较强的课扩展性。
代码说明:
1 /** 2 *假设已经设计好的类如下: 3 */ 4 class OldClass { 5 6 //功能1 7 public void method1(){} 8 9 //功能2 10 public int method2(){} 11 12 }
写一个新功能的接口:
1 /** 2 *新功能接口 3 */ 4 public interface NewClassImp{ 5 6 //新功能抽象方法声明 7 public void method3(); 8 }
原有的基类实现新的功能接口:
1 /** 2 *添加了新的功能的类 3 */ 4 class OldClass implements NewClassImp{ 5 6 //功能1 7 public void method1(){} 8 9 //功能2 10 public int method2(){} 11 12 //实现新的功能 13 public void method3(){} 14 }
研究技术需要静下心来,一点一点地深究.......