java笔记24 装饰设计模式

来源:互联网 发布:linux more cat 编辑:程序博客网 时间:2024/05/21 07:22

1.       装饰设计模式

1.1   当想要对已有的对象进行功能增强时

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能

那么自定义的类称之为装饰类。

1.2   装饰通常通过构造方法接收被装饰的对象

并基于被装饰的对象的功能,提供更强的功能

1.3   装饰和继承的区别

Reader:专门读取数据的类

数据分很多种,

所以有 TxtReader 、MediaReader等等

加入缓冲技术

                   BufferedTxtReader

                   BufferedMediaReader

这样会导致体系臃肿,为了避免这种现象,单独将缓冲进行封装,哪个对象需要缓冲就将哪个对象和缓冲关联。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能

所以装饰类和被装饰类通常是都属于一个体系中的

继承可以用,但是不要太多,可以结合装饰类使用。

2.       示例

自定义一个BufferedReader

*

    自定义一个类中包含一个功能和readline一致的方法

    模拟一下BufferedReader  

 */

 

package day19;

import java.io.*;

public class H_05MyBufferedReader {

    public static void main(String[] args) {

 

    }

}

class MyBufferedReader extends Reader//使用基类

{

    private Reader r;

    MyBufferedReader(Reader r)//使用基类对象 对其进行装饰

    {

        this.r=r;

    }

    public String myReadLine() throws IOException

    {

        //定义一个临时容器,原BufferedReader封装的是字符数组

        //为了演示方便,定义一个sb容器,再将数据变成字符串

        StringBuilder sb=new StringBuilder();

        int ch=0;

        while((ch=r.read())!=-1)

            {

                if(ch=='\r')

                    continue;

                else if(ch=='\t')

                    return sb.toString();

                else

                    sb.append((char)ch);                  

            }

        if(sb.length()!=0)

            return sb.toString();

        return null;      

    }

    /*

     * 需要变成体系 继承Reader

     * 就要覆盖Reader体系里的抽象方法

      */

    public void close() throws IOException {//复写Reader的方法

            r.close();     

    }

    public int read(char[] arg0int arg1int arg2throws IOException {

            return r.read(arg0arg1arg2);

    }

}


 

示例二 自定义LineNumberReader

import java.io.*;

public class H_10MyLineNumberReader {

    public static void main(String[] argsthrows IOException {

        FileReader fr=new FileReader("Demo.txt");

        MyLineNumberReader lnr=new MyLineNumberReader(fr);

        String line=null;

        while((line=lnr.myReaderLine())!=null)

        {

            System.out.println(lnr.getLineNumber()+line);

        }      

        lnr.close();

    }

}

 

class MyLineNumberReader extends Reader

{

    private Reader r;

    private int lineNumber;

    MyLineNumberReader(Reader r)

    {

        this.r=r;

    }

    public String myReaderLine() throws IOException

    {

        lineNumber++;//调用一次,自增一次

        StringBuilder sb=new StringBuilder();

        int ch=0;

        while((ch=r.read())!=-1)

        {

            if(ch=='\r')

                continue;

            else if(ch=='\n')

                return sb.toString();

            else

                sb.append((char)ch);

        }

        if(sb.length()!=0)

            return sb.toString();

        return null;

    }

    public void setLineNumber(int lineNumer)

    {

        this.lineNumber=lineNumber;

    }

    public int getLineNumber()

    {

        return lineNumber;

    }

    public void close() throws IOException {

        // TODO Auto-generated method stub

        r.close();

    }

    public int read(char[] cbufint offint lenthrows IOException {

        // TODO Auto-generated method stub

        return 0;

    }

}

0 0
原创粉丝点击