美文网首页Java
Java IO流装饰设计模式

Java IO流装饰设计模式

作者: 一亩三分甜 | 来源:发表于2019-09-17 21:15 被阅读0次

    装饰设计模式:

    当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类成为装饰类。
    装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

    class Person10
    {
        public void eat()
        {
            System.out.println("吃饭");
        }
    }
    class SuperPerson
    {
        private Person10 p;
        SuperPerson(Person10 p)
        {
            this.p = p;
        }
        public void superEat()
        {
            System.out.println("开胃酒");
            p.eat();
            System.out.println("甜点");
            System.out.println("来一根");
        }
    }
    public class PersonDemo {
        public static void main(String[] args) {
            Person10 p = new Person10();
            p.eat();
            SuperPerson sp = new SuperPerson(p);
            sp.superEat();
        }
    }
    //输出
    吃饭
    开胃酒
    吃饭
    甜点
    来一根
    

    MyReader//专门用于读取数据的类

     |--MyTextReader
         |--MyBufferTextReader
     |--MyMediaReader
         |--MyBufferMediaReader
     |--MyDataReader
         |--MyBufferDataReader
    
    class MyBufferReader
    {
       MyBufferReader(MyTextReader text)
       {}
       MyBufferReader(MyMediaReader media)
       {}
    }
    

    上面这个类扩展性很差。找到其参数的共同类型。通过多态的形式。可以提高扩展性。

    class MyBufferReader extends MyReader
    {
        MyBufferReader(MyReader r)
        {}
    }
    

    MyReader//专门用于读取数据的类。

     |--MyTextReader
     |--MyMediaReader
     |--MyDataReader
     |--MyBufferReader
    

    装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类与类之间的关系。

    装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。

    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    
    class MyBufferedReader0 extends Reader
    {
        private FileReader r;
        MyBufferedReader0(FileReader r)
        {
            this.r = r;
        }
        //可以一次读一行数据的方法。
        public String myReadLine()throws IOException
        {
            //定义一个临时容器。原BufferReader封装的是字符数组。
            //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
            StringBuilder sb = new StringBuilder();
            int ch = 0;
            while ((ch=r.read())!=-1)
            {
                if (ch=='\r')
                    continue;;
                if (ch=='\n')
                    return sb.toString();
                else
                    sb.append((char)ch);
            }
            //防止最后一行没有\n符
            if (sb.length()!=0)
                return sb.toString();
            return null;
        }
        public void close() throws IOException
        {
            r.close();
        }
        public int read(char cbuf[], int off, int len) throws IOException
        {
            return r.read(cbuf,off,len);
        }
    }
    public class MyBufferedReaderDemo0 {
        public static void main(String[] args) throws IOException
        {
            //创建一个读取流对象和文件相关联。
            FileReader fr = new FileReader("buf.txt");
            //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
            MyBufferedReader0 bufr = new MyBufferedReader0(fr);
    
            String line = null;
            while ((line=bufr.myReadLine())!=null)
            {
                System.out.println(line);
            }
            bufr.close();
        }
    }
    //输出
    abcd1
    abcd2
    abcd3
    abcd4
    

    LineNumberReader

    import java.io.FileReader;
    import java.io.IOException;
    import java.io.LineNumberReader;
    
    public class LineNumberReaderDemo {
        public static void main(String[] args) throws IOException
        {
            FileReader fr = new FileReader("DateDemo.java");
    
            LineNumberReader lnr = new LineNumberReader(fr);
    
            String line = null;
    
            lnr.setLineNumber(100);
    
            while ((line = lnr.readLine())!=null)
            {
                System.out.println(lnr.getLineNumber()+":"+line);
            }
            lnr.close();
        }
    }
    //输出
    101:import java.text.SimpleDateFormat;
    102:import java.util.Date;
    103:
    104:public class DateDemo {
    105:    public static void main(String[] args) {
    106:        Date d = new Date();
    107:        System.out.println(d);//打印的时间看不懂,希望有些格式
    108:
    109:        //将模式封装到SimpleDateformat对象中
    110:        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
    111:        //调用format方法让模式格式化指定Date对象
    112:        String time = sdf.format(d);
    113:        System.out.println("time="+time);
    114:    }
    115:}
    

    自定义LineNumberReader

    写法一:单独自定义一个类MyLineNumberReader

    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    
    class MyLineNumberReader
    {
        private Reader r;
        private int lineNumber;
        MyLineNumberReader(Reader r)
        {
            this.r = r;
        }
        public String myReadLine() throws IOException
        {
            lineNumber++;
            StringBuilder sb = new StringBuilder();
            int ch = 0;
            while ((ch=r.read())!= -1)
            {
                if (ch == '\r')
                    continue;
                if (ch == '\n')
                    return sb.toString();
                else
                    sb.append((char)ch);
            }
            if (sb.length() != 0)
                return sb.toString();
            return null;
        }
        public void  setLineNumber(int lineNumber)
        {
            this.lineNumber = lineNumber;
        }
        public int getLineNumber()
        {
            return lineNumber;
        }
        public void myClose() throws  IOException
        {
            r.close();
        }
    }
    public class MyLineNumberReaderDemo {
        public static void main(String[] args) throws IOException
        {
            FileReader fr = new FileReader("DateDemo.java");
            MyLineNumberReader mylnr = new MyLineNumberReader(fr);
            String line = null;
            mylnr.setLineNumber(100);
            while ((line = mylnr.myReadLine())!=null)
            {
                System.out.println(mylnr.getLineNumber()+"::"+line);
            }
            mylnr.myClose();
        }
    }
    //输出
    101::import java.text.SimpleDateFormat;
    102::import java.util.Date;
    103::
    104::public class DateDemo {
    105::    public static void main(String[] args) {
    106::        Date d = new Date();
    107::        System.out.println(d);//打印的时间看不懂,希望有些格式
    108::
    109::        //将模式封装到SimpleDateformat对象中
    110::        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
    111::        //调用format方法让模式格式化指定Date对象
    112::        String time = sdf.format(d);
    113::        System.out.println("time="+time);
    114::    }
    115::}
    

    写法二:自定义一个类继承于MyBufferedReader

    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    
    class MyLineNumberReader0 extends MyBufferedReader
    {
        private Reader r;
        private int lineNumber;
        MyLineNumberReader0(Reader r)
        {
            this.r = r;
        }
        public String myReadLine() throws IOException
        {
            lineNumber++;
            return super.myReadLine();
        }
        public void  setLineNumber(int lineNumber)
        {
            this.lineNumber = lineNumber;
        }
        public int getLineNumber()
        {
            return lineNumber;
        }
    }
    public class MyLineNumberReaderDemo0 {
        public static void main(String[] args) throws IOException
        {
            FileReader fr = new FileReader("DateDemo.java");
            MyLineNumberReader mylnr = new MyLineNumberReader(fr);
            String line = null;
            mylnr.setLineNumber(100);
            while ((line = mylnr.myReadLine())!=null)
            {
                System.out.println(mylnr.getLineNumber()+"::"+line);
            }
            mylnr.myClose();
        }
    }
    //输出
    101::import java.text.SimpleDateFormat;
    102::import java.util.Date;
    103::
    104::public class DateDemo {
    105::    public static void main(String[] args) {
    106::        Date d = new Date();
    107::        System.out.println(d);//打印的时间看不懂,希望有些格式
    108::
    109::        //将模式封装到SimpleDateformat对象中
    110::        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
    111::        //调用format方法让模式格式化指定Date对象
    112::        String time = sdf.format(d);
    113::        System.out.println("time="+time);
    114::    }
    115::}
    

    相关文章

      网友评论

        本文标题:Java IO流装饰设计模式

        本文链接:https://www.haomeiwen.com/subject/lcncuctx.html