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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周洋 黑马帝   /  2012-3-28 13:35  /  2251 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

装饰和继承到底有什么区别,视频里听不太明白

8 个回复

倒序浏览
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰模式的特点;
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的索引(reference)
(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

下表格列举了装饰模式和继承的不同:


装饰模式 VS 继承
装饰模式 继承
用来扩展特定对象的功能 用来扩展一类对象的功能
不需要子类 需要子类
动态地 静态地
运行时分配职责 编译时分派职责
防止由于子类而导致的复杂和混乱 导致很多子类产生,在一些场合,报漏类的层次
更多的灵活性 缺乏灵活性
对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。 对于所有可能的联合,客户期望
很容易增加任何的 困难
回复 使用道具 举报
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
优点:
可以动态扩展特定对象的功能,不需要有子类,灵活性较强,可以装饰传递过来的对象。装饰和被装饰的对象须在同一个体系中。

继承是为了扩充某一类的对象的对象功能,具体功能的实现交给子类,相对装饰模式的动态,继承则是静态,缺乏灵活性
回复 使用道具 举报
动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.
们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的.
使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能.


回复 使用道具 举报
毕老师 视频笔记

装饰模式比继续灵活,避免了继承体系的臃肿(java只能单继承)
装饰类和被装饰类功能类似,只是更强而已。。
回复 使用道具 举报
装饰模式是吧对象当做构造函数的参数扔进去进行封装装饰。。。

继承是层级关系。。。 这2个有可比性吗
回复 使用道具 举报
当要对一个类中方法 进行 功能 增强时, 我们就会选择 继承这个类 或者 装饰这个类 。

   继承 这个类 时,他不单是继承了 要对这个功能 增强的方法外,还继承了其他不需要的。
   而装饰这个类的话,你只需要 调用 这个 要对这个功能 增强的方法就行。 从而避免了体系的臃肿
回复 使用道具 举报
罗杰 中级黑马 2012-3-28 16:11:27
8#
继承和装饰都可以为一个基本类添加更强的功能
用老师的例子很容易看出,用装饰设计模式类的结构比较简洁
用继承的话可能为了添加一个方法(例如使用buffer)而派生出多个新的类,而装饰只需要1个类:
继承的结构:
MyReader
   |--MyTextReader
      |--MyBufferTextReader
   |--MyMediaReader
      |--MyBufferMediaReader
使用装饰设计模式的类的结构:
MyReader
   |--MyTextReader
   |--MyMediaReader
   |--MyBufferReader

关于装饰设计方法的使用正巧前几天写了篇日记,你可以看看:
http://llluojie.blog.163.com/blog/static/204923345201222652837611/
回复 使用道具 举报
抽象构件类
package com.shengsiyuan.decorator;

public interface Component
{
        public void doSomething();
}
具体构件类
package com.shengsiyuan.decorator;

public class ConcreteComponent implements Component
{
        @Override
        public void doSomething()
        {
                System.out.println("功能A");
        }

}
装饰类
package com.shengsiyuan.decorator;

public class Decorator implements Component
{
        private Component component;
       
        public Decorator(Component component)
        {
                this.component = component;
        }
       
        @Override
        public void doSomething()
        {
                component.doSomething();
        }
}
具体装饰类
package com.shengsiyuan.decorator;

public class ConcreteDecorator1 extends Decorator
{
        public ConcreteDecorator1(Component component)
        {
                super(component);
        }
       
        @Override
        public void doSomething()
        {
                super.doSomething();
               
                this.doAnotherThing();
        }
       
        private void doAnotherThing()
        {
                System.out.println("功能B");
        }
       
       
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马