Java中的装饰者模式和打印流

原创 2018年02月05日 09:27:26

装饰者模式(设计模式)

思想: 可以通过装饰 对原来的功能进行升级
BufferedOutputstream
需要 Outputstream 构造
可以使 FileOutputStream(被装饰者)
相当于装饰后 功能得到了提升 写入效率提高了

ObjectOutputstream
需要 Outputstream 构造
可以使用 FileOutputStream

通过ObjectOutputstream 装饰后
功能提升 可以写对象了

装饰者模式流程
1.把被装饰者 写成成员变量
2.构造方法中 给该成员变量赋值
3.对原有功能的升级

LineNumberReader(读行)

    public static void fun1() throws FileNotFoundException, IOException {
        FileReader fr = new FileReader("/Users/lanou/Desktop/Test/hh.txt");
        LineNumberReader lnr = new LineNumberReader(fr);
        //设置开始的行号
        lnr.setLineNumber(10);
        String string = "";
        while ((string = lnr.readLine()) != null) {

            System.out.println(string + ": " +  lnr.getLineNumber());
            }
        lnr.close();
        }
    }

利用装饰者模式 实现 LineNumberReader:

    被装饰者 Reader
    1.把read()方法升级 读行
    2.带行号
    3.关闭资源功能升级

    class UpToLineNumberReader{
        private Reader r;
        // 记录行号
        private int num = 0;
        // 有参无参构造方法
        public UpToLineNumberReader(){

        }
        public UpToLineNumberReader(){

        }
        // set/get方法
        public int getNum() {
        return num;
    }

        public void setNum(int num) {
            this.num = num;
        }
        // 功能升级 从读字节 升级到 读行
        public String upToRead() throws IOException {
            // 方法走一次 就代表读了一行
            num++;
            // 拼接字符串
            StringBuilder stringBuilder = new StringBuilder();
            int len = 0;
            while ((len = r.read()) != -1){
                // 进行拼接
                // 遇到换行 这一行字符串已经拼接完毕 直接返回就行
                // ASCII中 10 就代表换行 相当于"\n"
                if(len == 10){
                    return stringBuileder.toString();
                }else{
                    // 不换行 就拼接字符串
                    string.Builder.append((char)len);
                }
            }
            // 读完了 没有内容可以继续拼接了
            if (stringBuilder.length() == 0) {
                return null;
            }
            return stringBuilder.toString();
        }
        // 关闭资源
        public void closeUpToRead() throws IoException {
            r.close();
        }
    }

打印流

PrintStream(输出字节)
构造方法可接收的参数:
1.文件(File)
2.字节输出流(Outputstream)
3.文件路径

PrintWriter(输出字符)
1.只能作为数据的目的地
2.可以把数据原样输出
3.永远不会抛出IOException
但是 可以抛出 其他异常 例如: 空指针
4.打印流相当于 可以给其他的流对象 装饰了一个 原样输出的功能

System.in是BufferedInputStream 缓冲输入字节流
作用:接受键盘输入内容
System.out是PrintStream 打印输出字节流
作用:输出内容到控制台

    public static void main(String[] args) throws IOException {
        // fun1();
        System.out.println("请输入");
        InputStream in = System.in;
        StringBuffer stringBuffer = new StringBuffer();
        int len = 0;
        while (true) {
            if (stringBuffer.toString().endsWith("quit")) {
                break;
            }
            len = in.read();
            if (len == 10) {
                System.out.println(stringBuffer.toString());
                stringBuffer.delete(0, stringBuffer.length());
            } else {
                stringBuffer.append((char) len);
            }
        }
    }

    /**
     * @throws FileNotFoundException
     */
    public static void fun1() throws FileNotFoundException {
        File file = new File("/Users/lanou/Desktop/haha/long.txt");
        // 创建缓冲字节输出流
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 创建一个打印字节流
        PrintStream ps = new PrintStream(bos);
        // 写数据
        ps.println("wanglong");
        ps.println(true);
        ps.print(100);
        ps.print(3.5);
        // 关闭资源
        ps.close();
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

IO流_打印流的概述和特点

package cn.itcast_03; /* * 打印流 * 字节打印流 PrintStream * 字符打印流 PrintWriter * * 打印流的特点: * A:只有写数...
  • L1585931143
  • L1585931143
  • 2017年02月27日 21:08
  • 313

【Java基础知识】IO流--标准输入输出流、打印流PrintStream

PrintStream
  • zhuwenchao90
  • zhuwenchao90
  • 2017年01月21日 22:39
  • 414

Java IO _打印流

掌握打印流的操作 掌握格式化输出 1、打印流 在整个 IO 包中,打印流是输出信息最方便的类,主要包含字节打印流(PrintStream) 和字符打印流(PrintWriter) . 打印流提供...
  • hanshileiai
  • hanshileiai
  • 2011年08月24日 10:48
  • 6534

装饰者模式 java代码小示例

1、定义及作用该模式以对客户端透明的方式扩展对象的功能。2、涉及角色抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。具体构件角色:将要被附加功能的类,实现抽象构件角色接口。抽象装饰者角色:持有...
  • xiaoquanhuang
  • xiaoquanhuang
  • 2011年04月08日 20:07
  • 2843

详细讲解装饰者模式和继承之间的关系和优劣(讲道理这事儿,不怕过 就怕不够)

在上一个装饰者模式简单实例中,可能有的朋友会觉得:使用继承不也是可以实现的嘛,干嘛这么麻烦。具体如下: 新建一个类,继承PersonBefore,然后,在子类里面调用super.eat(),也是可以直...
  • qq_27093465
  • qq_27093465
  • 2016年11月24日 18:12
  • 1235

Java中的装饰者模式

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案 接下来举一个例子来说明,这个例子是Head Frist 设计模式中的一个例子 场景:在星巴克的咖啡销售系统中...
  • qq_28007533
  • qq_28007533
  • 2016年12月08日 00:14
  • 723

设计模式实战应用之三:装饰者模式

装饰者模式的定义        装饰者模式是应用最普遍的设计模式之一。伟大的 Java 缔造者们将设计模式的应用发挥到了极致,作为解释型语言的 Java 从诞生到今天始终能够作为最主流与应用最广泛的语...
  • defonds
  • defonds
  • 2014年01月03日 21:17
  • 6935

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。 今天再重新学习下,把学习心得分享给大家一下...
  • lulei9876
  • lulei9876
  • 2014年10月14日 10:55
  • 12346

java笔记-IO流-字节打印流

PrintStream将各种数据类型的数据原样打印。 PrintStream 字节打印流 构造函数可以接收的参数类型 1.File对象 :File 2.字符串路径:String 3.字节...
  • Cs1275
  • Cs1275
  • 2014年08月12日 11:20
  • 1063

Java IO操作——打印流(PrintStream、PrintWriter)的使用

学习目标 掌握打印流的操作 掌握格式化输出 打印流 在整个IO包中,打印流是输出信息做方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)。打印流提供了...
  • u013087513
  • u013087513
  • 2016年07月21日 12:34
  • 1343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的装饰者模式和打印流
举报原因:
原因补充:

(最多只允许输入30个字)