IO流-04

来源:互联网 发布:微博显示网络异常 编辑:程序博客网 时间:2024/06/06 04:56


1.装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,
将已有对象传入,基于已有的功能,并提供加强功能
那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。

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

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

class Person
{
 public void chifan()
 {
  System.out.println("吃饭");
 }
}
class SuperPerson
{
 private Person p;//定义一个Person类类型属性
 SuperPerson(Person p) // 构造函数
 {
  this.p = p;
 }
 public void superChifan()
 {
  System.out.println("开胃酒");
  p.chifan(); // 直接调用Person中方法
  System.out.println("甜点");
  System.out.println("来一根");
 }
}
class PersonDemo
{
 public static void main(String[] args)
 {
  Person p = new Person();//new一个p对象;
  
  SuperPerson sp = new SuperPerson(p);//这个p是new出来的p,
  sp.superChifan();
 }
}

 

2.使用LineNumberReader()中的方法,读取行号,可使用的方法为getLineNumber()和setLineNumber();

import java.io.*;
class LineNumberReaderDemo
{
 public static void main(String[] args)throws IOException
 {
  FileReader fr = new FileReader("PersonDemo.java");
  
  LineNumberReader lnr = new LineNumberReader(fr);//建立LineNumberReader,并传入字节流对象
  
  String line = null;
  lnr.setLineNumber(100);//设置行号初始数为100(不包含),从101开始
  while((line=lnr.readLine()) != null)
  {
   System.out.println(lnr.getLineNumber()+":"+line);
   //获取行号从1号开始输出 ,输出行号和内容
  }
  lnr.close();
 }
}

3.练习:模拟一个带行号的缓冲区对象
import java.io.*;
class MyLineNumberReader
{
 private Reader r;
 private int lineNumber;
 
 MyLineNumberReader(Reader r)
 {
  this.r = r; 
 }
 
 public String myReadLine()throws IOException
 {
  lineNumber++; //行号自增。
  StringBuilder sb = new StringBuilder();//建立StringBuilder容器,并创建对象
  int ch = 0;
  
  while((ch=r.read()) != -1)//while循环判断文件是否为空
  {
   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(); 
 }
}

class MyLineNumberReaderDemo
{
 public static void main(String[] args)throws IOException
 {
  FileReader fr = new FileReader("PersonDemo.java");
  MyLineNumberReader mylnr = new MyLineNumberReader(fr); //创建MyLineNumberReader对象,并传入流对象
  
  String line = null;
  mylnr.setLineNumber(100); //设置行号
  while((line = mylnr.myReadLine()) != null)
  {
   System.out.println(mylnr.getLineNumber()+"::"+line);//输出行号和内容
    
  }
  mylnr.myClose();
 }
}

 

个人总结:装饰设计模式是是增强功能,通常用构造方法接收被装饰的对象,比继承更灵活,减少类之间的关系

                 掌握行号的输出方法,利用LineNumberReader()方法创建对象,使用setLineNumber()设置行号和

                 getLineNumber()获取行号的方法 了解LineNumberReader()内部运行原理,并能用代码实现