黑马程序员技术交流社区

标题: 装饰和继承的问题 [打印本页]

作者: 一帆风顺    时间: 2012-12-19 23:26
标题: 装饰和继承的问题
本帖最后由 王博 于 2012-12-25 14:30 编辑

对于毕老师视频里说的例子,有点不明白啊,希望能帮忙解释一下
MyReader//专门用于读取数据的类。
                  |--MyTextReader
                  |--MyBufferTextReader
                  |--MyMediaReader
                  |--MyBufferMediaReader
                  |--MyDataReader
                  |--MyBufferDataReader
//这里明白的,这个是MyReader的体系,显得过于臃肿,不建议使用
//于是把MyBufferReader的功能向上抽取就出现了下面的类
class MyBufferReader
{
                MyBufferReader(MyTextReader text)
                {}
                MyBufferReader(MyMediaReader media)
                {}
}
//但是上面这个类扩展性很差。
//于是找到其参数的共同类型。通过多态的形式。可以提高扩展性。
//但是MyBufferResder不是装饰MyReader类的么,怎么变成子类了?
//这里不是很明白,还有我上面的理解如果有不对的,希望给指出来。。。
class MyBufferReader extends MyReader
{
                private MyReader r;
                MyBufferReader(MyReader r)
                {}
}        



作者: 高境    时间: 2012-12-19 23:40
使用装饰模式的优点和缺点
使用装饰模式主要有以下的优点:
    装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。
使用装饰模式主要有以下的缺点:
    由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

作者: 焦健    时间: 2012-12-20 00:27
MyReader//专门用于读取数据的类。
                  |--MyTextReader
                  |--MyMediaReader
                  |--MyDataReader
                  |--MyBufferReader
是改为上面这样的形式了,MyBufferedReader继承MyReader,不是用于修饰MyReader类的,是用于修饰MyReader的子类的,
因为子类较多,而且有可能进行扩展,所以MyBufferedReader使用所有子类的共同父类,即MyReader类作为参数类型,以多态的形式实现了该功能,
因为接收的是MyReader类类型的参数,所以,只要是MyReader的子类类型都能够接收并进行修饰。方便了扩展。
class MyBufferReader extends MyReader
{
                private MyReader r;
                MyBufferReader(MyReader r)
                {}
}        




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2