黑马程序员技术交流社区

标题: 什么是装饰设计模式?有什么好处啊? [打印本页]

作者: 何清林    时间: 2014-2-24 20:58
标题: 什么是装饰设计模式?有什么好处啊?
什么是装饰设计模式?有什么好处啊?

作者: 丶小天    时间: 2014-2-24 21:05
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
优点是:
1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
作者: flying    时间: 2014-2-24 21:22
装饰类就在不改类的情况下对类的功能进行扩展
如有一个父类A  有B C D E F五个子类  他们共同继承fun()
如果想要对B C D种的方法fun()进行扩展
可以继承写一个新的类  G继承A
在G种对类B C D种的方法进行改造

作者: volvoxc    时间: 2014-2-24 21:32
装饰着模式,顾名思义,就是新写一个类对原有的类的对象进行装饰,使其拥有更强的功能。装饰着模式相对继承最大的好处就是它避免了继承的臃肿,降低了类与类之间的联系。因为,一个类只能继承自一个类,每一个需要加强的类都需要有一个子类对其进行装饰。如果采用装饰着模式,则可以使用接口,只写一个类,就可以对整个体系中的类进行功能的加强。
作者: 我要的幸福呢    时间: 2014-2-24 21:41
本帖最后由 我要的幸福呢 于 2014-2-24 21:42 编辑

装饰设计模式,顾名思义就是起到一个“装饰”的作用,其实就是在原来注功能实现的基础上增加一些功能,但又不改变原来的对象。用毕老师视频中的例子来说,就是一个人Person类有一个吃饭chifan()的功能(可以想象成吃主食),但现在想增加一些功能,比如吃饭前先吃点凉菜什么的,吃完饭后再吃点甜点或者抽根烟什么的,但直接在原来的功能上增加代码又不太好,因为可能这些功能只是你需要的,别人并不需要。因此,就创建一个新的类,将Person类传入这个类中,然后再新创建的类中通过Person对象调用chifan()方法,在其前面或后面加上你想要实现的加强功能,这个新创建的类就叫装饰类。通常装饰类想要实现的功能,和被“装饰”的类功能是重复的,所以让装饰类继承被装饰类,这样就可以增强所有被装饰类的子类(比如学生Student和工人Worker)的功能。代码实现如下:
  1. class Person {
  2.         public void chifan()
  3.         {
  4.                 System.out.println("吃饭啦!");               
  5.         }
  6. }

  7. class Student extends Person {
  8.         @Override
  9.         public void chifan() {
  10.                 // TODO Auto-generated method stub
  11.                 super.chifan();
  12.                 System.out.println("我吃的是食堂的大锅");
  13.         }
  14. }

  15. class Worker extends Person {
  16.         @Override
  17.         public void chifan() {
  18.                 // TODO Auto-generated method stub
  19.                 super.chifan();
  20.                 System.out.println("我吃的是工地的盒饭");
  21.         }
  22. }

  23. //装饰类
  24. class Decoration extends Person {
  25.         private Person p;
  26.         public Decoration(Person p) {
  27.                 this.p = p;
  28.         }
  29.         @Override
  30.         public void chifan() {
  31.                 // TODO Auto-generated method stub
  32.                 System.out.println("先吃点开胃小菜");
  33.                 p.chifan();
  34.                 System.out.println("吃饱了,来一根");
  35.         }
  36. }

  37. public class DecorationDemo {

  38.         /**
  39.          * @param args
  40.          */
  41.         public static void main(String[] args) {
  42.                 // TODO Auto-generated method stub
  43.                 Person p = new Person();
  44.                 p.chifan();
  45.                 Student s = new Student();
  46.                 s.chifan();
  47.                 Worker w = new Worker();
  48.                 w.chifan();
  49.                
  50.                
  51.                 Decoration d1 = new Decoration(p);
  52.                 Decoration d2 = new Decoration(s);
  53.                 Decoration d3 = new Decoration(s);
  54.                
  55.                 d1.chifan();
  56.                 d2.chifan();
  57.                 d3.chifan();
  58.         }

  59. }
复制代码



作者: 何清林    时间: 2014-2-24 21:42
flying 发表于 2014-2-24 21:22
装饰类就在不改类的情况下对类的功能进行扩展
如有一个父类A  有B C D E F五个子类  他们共同继承fun()
...

貌似不是这样,我又看了以下资料,总结了一下(和你分享一下):
装饰类用于给已存在的类增强功能。
      装饰类是通过定义一个类,通过构造函数接收需要增强的类的对象,然后并基于被装饰对象的功能提供更加强大的功能。这就是装饰类。
     给人觉得装饰类的功能可以用继承做到,但是这样做会导致体系臃肿,不如装饰类灵活方便,。
作者: 何清林    时间: 2014-2-24 21:47
我要的幸福呢 发表于 2014-2-24 21:41
装饰设计模式,顾名思义就是起到一个“装饰”的作用,其实就是在原来注功能实现的基础上增加一些功能,但又 ...

通常装饰类想要实现的功能,和被“装饰”的类功能是重复的,所以让装饰类继承被装饰类,这样就可以增强所有被装饰类的子类(比如学生Student和工人Worker)的功能。这点不明白,为什么继承被装饰类就能够增强其子类?
作者: 我要的幸福呢    时间: 2014-2-24 21:53
何清林 发表于 2014-2-24 21:47
通常装饰类想要实现的功能,和被“装饰”的类功能是重复的,所以让装饰类继承被装饰类,这样就可以增强所 ...

因为你在装饰类中要调用Person的chifan方法,而Person的子类也覆写了chifan()方法
作者: 何清林    时间: 2014-2-24 22:01
本帖最后由 何清林 于 2014-2-24 22:03 编辑
我要的幸福呢 发表于 2014-2-24 21:53
因为你在装饰类中要调用Person的chifan方法,而Person的子类也覆写了chifan()方法 ...

我用你给的程序,去掉继承Person也一样达到增强Person子类的效果,请看:

吃饭啦!
吃饭啦!
我吃的是食堂的大锅
吃饭啦!
我吃的是工地的盒饭
先吃点开胃小菜
吃饭啦!
吃饱了,来一根
先吃点开胃小菜
吃饭啦!
我吃的是食堂的大锅
吃饱了,来一根
先吃点开胃小菜
吃饭啦!
我吃的是工地的盒饭
吃饱了,来一根
----------------------------------
所以不用继承Person也可以的

作者: 我要的幸福呢    时间: 2014-2-24 22:05
何清林 发表于 2014-2-24 22:01
我用你给的程序,去掉继承Person也一样达到增强Person子类的效果,请看:

吃饭啦!

那确实是,继承Person类不是必须的,但因为他加强的是Person以及其子类Student、Worker这个体系中所有类的功能,所以可以将其归入这个体系
作者: chenfc8578    时间: 2014-2-25 00:05
装饰设计模式:
当想要对已有的对象进行功能增强时,
可以自定义类,将已有的对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。

装饰类通常通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
作者: luoanjade    时间: 2014-2-25 00:19
看看毕老师讲的那个BufferedReader和BufferedWriter,就能理解什么是装饰设计模式了。用处就是为了加强功能。




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