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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

例如,BufferedReader类可以用来装饰FileReader类,这两个类都是继承的Reader类。FileReader 类对象是BufferedReader类的属性,但是为什么这两个类都要继承至Reader类呢?BufferedReader类就算不继承Reader类,不也可以实现装饰功能么?

6 个回复

正序浏览
ZYZQ 中级黑马 2015-6-7 00:00:08
7#
会AA会BB会CC会DD的XXX,大概这个意图吧
回复 使用道具 举报
装饰一个类,我肯定得知道这个类里有哪些方法呀。那么多方法一个个去写实在太傻,直接拿到被装饰类的父类或者接口就知道它有哪些方法。 当然,少部分代码还是要自己实现。
回复 使用道具 举报
file:///C:/Users/Administrator/Desktop/test1.JPG
回复 使用道具 举报
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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马