黑马程序员技术交流社区

标题: 装饰类和被装饰的类为什么通常都是继承至同一个类? [打印本页]

作者: win_rainbow    时间: 2015-5-31 13:03
标题: 装饰类和被装饰的类为什么通常都是继承至同一个类?
例如,BufferedReader类可以用来装饰FileReader类,这两个类都是继承的Reader类。FileReader 类对象是BufferedReader类的属性,但是为什么这两个类都要继承至Reader类呢?BufferedReader类就算不继承Reader类,不也可以实现装饰功能么?
作者: edithe    时间: 2015-5-31 16:35
本帖最后由 edithe 于 2015-5-31 16:39 编辑

装饰类,我认为是相互叠加的过程,箱子外再套箱子,两个装饰类本来都是独立的类,但是因为要叠加,所以必须让彼此产生关系,即调用彼此的对象,所以在内部维护一个对象,但是不能明确指向实体(因为装饰类有很多),但是内部维护的对象却要可以指向任何一个装饰类,这就可以利用多态了(父类引用对象指向子类对象实体),所以必须继承某类或者实现接口
如果不继承或者实现接口,那么多个装饰类相叠加的时候就麻烦多了,这有悖面向对象的思想吧

描述不是很清楚,下面附上简单代码,以便理解
  1. interface Work{
  2.         public void job();
  3. }
  4. class Child implements Work{
  5.         Work work;

  6.         public void job(){
  7.                 System.out.println("画画");
  8.         }        
  9. }
  10. class Mother implements Work{
  11.         Work work;
  12.         public Mother(Work work){
  13.                 this.work=work;
  14.         }
  15.         public void job(){
  16.                 work.job();
  17.                 System.out.println("上色");
  18.         }        
  19. }
  20. class Father implements Work{
  21.         Work work;
  22.         public Father(Work work){
  23.                 this.work=work;
  24.         }
  25.         public void job(){
  26.                 work.job();
  27.                 System.out.println("装裱");
  28.         }        
  29. }
复制代码

作者: win_rainbow    时间: 2015-6-4 22:01
赞!!!
作者: win_rainbow    时间: 2015-6-4 22:02
edithe 发表于 2015-5-31 16:35
装饰类,我认为是相互叠加的过程,箱子外再套箱子,两个装饰类本来都是独立的类,但是因为要叠加,所以必须 ...

赞!!!
作者: win_rainbow    时间: 2015-6-6 15:15
file:///C:/Users/Administrator/Desktop/test1.JPG
作者: fenglinluomu    时间: 2015-6-6 16:26
装饰一个类,我肯定得知道这个类里有哪些方法呀。那么多方法一个个去写实在太傻,直接拿到被装饰类的父类或者接口就知道它有哪些方法。 当然,少部分代码还是要自己实现。
作者: ZYZQ    时间: 2015-6-7 00:00
会AA会BB会CC会DD的XXX,大概这个意图吧




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