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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尖卡斌引 中级黑马   /  2013-5-26 14:22  /  1200 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

装饰类 比继承灵活在什么地方呢?  装饰不还是在内部调用了被装饰的类吗?谁给详细的解释下

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

3 个回复

倒序浏览
装饰类之所以比继承灵活,是因为它避免了继承体系给程序带来的臃肿。因为继承只能是单继承的,如果你为了给这个类增加功能就使用继承,那么你就不能再去继承其他的类了。
回复 使用道具 举报
假设有一个继承体系:
  A-|--A1
    |--A2
    |--A3
当子类的功能都需要加强,且加强的方法基本一致时,如果采用继承覆写的方式,那么,继承体系显得臃肿(“三代”类出现),为了解决这个问题,引入一个装饰类A‘继承A,它的构造方法中有参数,这个参数就是你需要加强的对象引用,然后通过传入对象的方法加强相应功能。由于有了入参,可以通过多态的形式传入需要加强的对象。因此更加灵活。希望你LZ能明白哈。
回复 使用道具 举报
这个今天又个类似的问题
下面是我的笔记

  1. /*装饰者设计模式与继承的比较

  2. MyReader//专门用于读取数据-----继承的结构
  3.         |--MyTextReader
  4.                 |--MyBufferTextReader
  5.         |--MyMediaReader
  6.                 |--MyBufferMediaReader
  7.         |--MyDataReader
  8.                 |--MyBufferDataReader

  9. class MyBufferReader
  10. {
  11.         MyBufferReader(MyTextReader text){
  12.         }

  13.         MyBufferReader(MyMediaReader text){
  14.         }

  15.         MyBufferReader(MyDataReader text){
  16.         }
  17. }
  18. 该类的扩展性很差,
  19. 找到其参数的共同类型,通过多态形式通过扩展性

  20. class MyBufferReader extends MyReader                //继承公共父类,即MyReader,而不像继承结构中-继承MyReader的子类
  21. {
  22.         MyBufferReader(MyReader r){
  23.         }
  24. }

  25. MyReader//专门用于读取数据的类-----装饰模式的结构
  26.         |--MyTextReader
  27.         |--MyMediaReader
  28.         |--MyDataReader
  29.         |--MyBufferReader     //组合结构

  30. */


  31. import java.io.*;

  32. class MyBufferedReader extends Reader
  33. {
  34.         private Reader fr = null;
  35.         MyBufferedReader(Reader fr){
  36.                 this.fr = fr;
  37.         }

  38.         public String myReadLine() throws IOException{
  39.                 StringBuilder sb = new StringBuilder();   //StringBuilder();
  40.                 int ch = 0;
  41.                 while ((ch = fr.read())!= -1)
  42.                 {
  43.                         if (ch=='\r')
  44.                                 continue; // the keyword continue.
  45.                         if(ch == '\n')
  46.                                 return sb.toString();
  47.                         sb.append((char)ch);
  48.                 }
  49.                 if (sb.length() != 0)
  50.                         return sb.toString(); //important to return the last line.
  51.                
  52.                 return null;
  53.         }

  54.         public int read (char[] buf, int off, int len) throws IOException{
  55.                 return read (buf, off, len);                //调用对象方法
  56.         }

  57.         public void close() throws IOException{
  58.                 fr.close();                        //调用对象方法
  59.         }

  60.         public void myClose() throws IOException{
  61.                 fr.close();
  62.         }

  63. }

  64. class MyBufferedReaderDemo{

  65.         public static void main(String[] args) throws IOException
  66.         {
  67.                 FileReader fr = new FileReader("buf.txt");
  68.                 MyBufferedReader mr = new MyBufferedReader(fr);
  69.                 String line = null;
  70.                 while ((line = mr.myReadLine()) != null)
  71.                 {
  72.                         System.out.println(line);
  73.                 }
  74.                 System.out.println("Hello World!");
  75.         }
  76. }
复制代码
毕老师的课程是第19天
装饰和继承的比较
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马