A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2013-5-15 21:27  /  1906 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

装饰设计模式
概念: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有功能,并提供加强功能 那么自定义的该类称为装饰类
由来:举例说明
例如现在有如下类的设计用于读取数据
[java] view plaincopy
MyReader//专门用于读取数据的类。  
    |--MyTextReader//用于读取文本  
    |--MyMediaReader//用于读取媒体  
后来发现两个子类的读取功能太差,就想引入缓冲技术,从继承角度思考,我们需要把每一个类分别创建子类,增加缓冲的功能,于是改变其体系结构如下
[java] view plaincopy
MyReader//专门用于读取数据的类。  
    |--MyTextReader//用于读取文本  
        |--MyBufferTextReader  
    |--MyMediaReader//用于读取媒体  
        |--MyBufferMediaReader  
这样一来 如果MyReader类再有新的子类,我们还要再创建其子类的带有缓冲功能的子类,如下
[java] view plaincopy
MyReader//专门用于读取数据的类。  
    |--MyTextReader//用于读取文本  
        |--MyBufferTextReader  
    |--MyMediaReader//用于读取媒体  
        |--MyBufferMediaReader  
    |--MyDataReader//用于读取数据  
        |--MyBufferDataReader  
不难发现,这样的体系结构有两个缺点:1、扩展性极差;2、体系臃肿
于是我们想能不能把带有缓冲技术的子类抽取出来,做一个公共的类,将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。这样继承体系就变得很简单。优化了体系结构。
于是写一个有缓冲功能的类

[java] view plaincopy
class MyBufferReader  
{  
     MyBufferReader(MyTextReader text){}  
     MyBufferReader(MyMediaReader media){}  
}  
发现这样扩展性很差,于是找到其参数的共同类型,使用多态的形式,提高了程序的扩展性,修改如下
[java] view plaincopy
class MyBufferReader extends MyReader  
{  
         private MyReader r;  
         MyBufferReader(MyReader r){}  
}   
这里MyBufferReader就是所谓的装饰类,之所以要继承MyReader,装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。这样类的结构就改变为
[java] view plaincopy
MyReader//专门用于读取数据的类。  
         |--MyTextReader  
         |--MyMediaReader  
         |--MyDataReader  
         |--MyBufferReader  
装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马