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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© anyanyhai 中级黑马   /  2012-3-26 22:24  /  1898 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

装饰和继承的相同点,不同点是什么?

最好能详细点,有例子说明最好了,

那位大神解释下~

4 个回复

正序浏览
装饰设计模式,是对已有的功能的增强,使用缓冲区对各种功能进行效率提高,对方法封装。
        继承是对已有的类的继承。他是把父类的方法继承来供自己使用,若是对父类的方法不满意可以进行覆盖,但是一个子类只能继承一个父类,有一定的局限性,并且程序显得复杂。
回复 使用道具 举报
装饰和集成属于一个体系,装饰设计模式的出现避免了集成体系关系的臃肿,比继承更为灵活。如果是为了增强功能,这种方式解决起来更为方便。
比如现在要对该体系中的对象进行功能的增强。增强的最常见手段就是缓冲区。
先将数据写到缓冲区中,再将缓冲区中的数据一次性写到目的地。
按照之前学习过的基本的思想,那就是对对象中的写方法进行覆盖。
产生已有的对象子类,复写write方法。不往目的地写,而是往缓冲区写。
所以这个体系会变成这样。
Writer
        |--TextWriter write:往目的地
                |--BufferTextWriter write:往缓冲区写
        |--MediaWriter
                |--BufferMediaWriter       
想要写一些其他数据。就会子类。DataWriter,为了提高其效率,还要创建该类的子类。BufferDataWriter
Writer
        |--TextWriter write:往目的地
                |--BufferTextWriter write:往缓冲区写
        |--MediaWriter
                |--BufferMediaWriter
        |--DataWriter
                |--BufferDataWriter               
发现这个体系相当的麻烦。每产生一个子类都要有一个高效的子类。
而且这写高效的子类使用的功能原理都一样,都是缓冲区原理。无论数据是什么。
都是通过缓冲区临时存储提高效率的。
那么,对于这个体系就可以进行优化,因为没有必要让每一个对象都具备相同功能的子类。
哪个对象想要进行效率的提高,只要让缓冲区对其操作即可。也就说,单独将缓冲区进行封装变成对象。
//它的出现为了提高对象的效率。所以必须在创建它的时候先有需要被提高效率的对象
class BufferWriter
{
        [];
        BufferedWriter(Writer w)
        {
       
        }
        /*
        BufferWriter(TextWriter w)
        {
               
        }
        BufferedWriter(MediaWriter w)
        {
               
        }
        */
}
BufferWriter的出现增强了Writer中的write方法。
但是增强过后,BufferWriter对外提供的还是write方法。只不过是高效的。
所以写的实质没有变,那么BufferWriter也是Writer中的一员。
所以体系就会变成这样。
Writer
        |--TextWriter
        |--MediaWriter
        |--BufferWriter
        |--DataWriter
回复 使用道具 举报
继承是父子关系,装饰是合作伙伴关系,尽管他们也需要在同一IO体系里。由BufferedReader、BufferedWriter友情提供装饰,请看
BufferedReader bufr=null;
         BufferedWriter bufw=null;

bufr=new BufferedReader(new FileReader("c:\\123.txt"));
bufw=new BufferedWriter(new FileWriter("d:\\321.txt"));意思就是你要高效吗?由我来初始化源流,你直接拿要读写的文件过来。流程的中转由BufferedReader、BufferedWriter处理。还是那个例子,好比家里来了客人,你烧壶开水往桌子上放在那,终归不是待客之道吧。要拿茶杯、茶碗倒出来,端过去,客人不喝或喝完了,你再拿走。
回复 使用道具 举报
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
装饰是构造函数参数传递进行增强
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马