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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李大强 中级黑马   /  2013-2-11 18:26  /  1634 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在装饰设计模式中,为什么装饰类和被装饰类都必须所属同一个接口或者父类?

直接定义一个Buffer类来接收一个特定的输入流或输出流,然后再自定义一个缓冲区对流中的数据进行缓冲不就行了,
何必非要属于同一个接口或者父类呢?

我想象中的缓冲类如下:

class BufferWriter//此类跟本就没必要和被装饰类属于同一个接口或者父类!
{
       
        BufferWriter(Wirter w)
        {
       
        }
}


class BufferWriter extends Writer //此类为什么非要和被装饰类属于同一个接口或者父类呢?
{
        BufferWriter(Writer w)
        {
        }
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 周怡 于 2013-2-11 20:40 编辑

这个就是装饰模式嘛,你看下
  1. public class BufferedWriter extends Writer {
  2.     //装饰模式
  3.     private Writer out;
  4. }
  5.    //构造函数
  6.     public BufferedWriter(Writer out, int sz) {
  7.         super(out);
  8.         if (sz <= 0)
  9.             throw new IllegalArgumentException("Buffer size <= 0");
  10.         this.out = out;
  11.         cb = new char[sz];
  12.         nChars = sz;
  13.         nextChar = 0;
  14.         //获取换行的符号\n \r,和方法System.getProperty("line.separator")一样
  15.         lineSeparator =        (String) java.security.AccessController.doPrivileged(
  16.                new sun.security.action.GetPropertyAction("line.separator"));
  17.     }
  18. //write有关
  19. public void write(int c) throws IOException {
  20.         synchronized (lock) {
  21.             //判断是否有输出流
  22.             ensureOpen();
  23.             //如果缓存数组写满了,就flush数组。
  24.             if (nextChar >= nChars)
  25.                 flushBuffer();
  26.             //将内容写入缓存数组中
  27.             cb[nextChar++] = (char) c;
  28.         }
  29. }
  30. //flush,这个方法就知道flush的重要性,
  31. void flushBuffer() throws IOException {
  32.         synchronized (lock) {
  33.             ensureOpen();
  34.             if (nextChar == 0)
  35.                 return;
  36.             //将数据写入流
  37.             out.write(cb, 0, nextChar);
  38.             nextChar = 0;
  39.         }
  40. }

  41. public void write(String s, int off, int len) throws IOException {
  42.         synchronized (lock) {
  43.             ensureOpen();
  44.             
  45.             int b = off, t = off + len;
  46.             while (b < t) {
  47.                 int d = min(nChars - nextChar, t - b);
  48.                 //将字符串转为字符数组
  49.                 s.getChars(b, b + d, cb, nextChar);
  50.                 //写入缓存数组
  51.                 b += d;
  52.                 nextChar += d;
  53.                 if (nextChar >= nChars)
  54.                     //如果写满了,就写入流中。
  55.                     flushBuffer();
  56.             }
  57.         }
  58. }
  59. //writeLine 写一个换行
  60. public void newLine() throws IOException {
  61.         //同样写到缓存数组里
  62.         write(lineSeparator);
  63. }
  64. //flush
  65. public void flush() throws IOException {
  66.         synchronized (lock) {
  67.             flushBuffer();
  68.             out.flush();
  69.         }
  70. }
  71. //关闭资源
  72. public void close() throws IOException {
  73.         synchronized (lock) {
  74.             if (out == null) {
  75.                 return;
  76.             }
  77.             try {
  78.                 //最后还释放了一次。不过没有执行flush方法,所以在close前还是要执行一次flush!
  79.                 flushBuffer();
  80.             } finally {
  81.                 out.close();
  82.                 out = null;
  83.                 cb = null;
  84.             }
  85.         }
  86. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马