java 装饰者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/X18621144576/article/details/79243527

装饰者模式(设计者模式)

1.装饰者模式
思想: 可以通过装饰 对原来的功能进行升级
例如:
BufferedOutputStream 传入的参数是 FileOutputStream
相当于把FileOutputStream装饰了 装饰后 功能得到提升 写入效率提高

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

装饰者模式的好处:
高内聚(类中的方法之间的联系做好紧密)
低耦合(解耦)(类和类之间 尽量不要产生联系)

//利用装饰者模式实现LineNumberReader
class MyLineNumberReader {
    //把被装饰者写成成员变量
    private Reader reader;
    // 记录行号
    private int num = 0;
    public void getNum(){
    }
    public void setNum(int num){
        this.num = num;
    }
    //构造方法中 给该成员变量赋值
    public WLLineNumberReader() {
    }
    public WLLineNumberReader(Reader reader) {
        this.reader = reader;
    }
    //对原有功能升级
    //从读字节 到读行
    public String myRead() throws IOException{
    //方法走一次 就代表读了一行
    num++;
    //拼接字符串
    StringBuilder sb = new StringBUilder();
    //把读出来的字节拼接成字符串
    int len = 0;
    while((len = reader.read()) != -1){
        //进行拼接
        //遇到换行 这一行已经拼接完成 直接返回
        if(len = '\n'){
        return sb.toString();
        }else{
        //不换行 就拼接字符串
        sb.appened((char)len);
        }
    }
    //读完了 没内容可拼接了
    if(sb.length() == 0){
    return null;
    }
    return sb.toString();
    //关闭资源
    public void myclose() throw IOEXception{
        reader.close();
    }
}

LineNumberReader

2.跟踪行号的缓冲字符输入流LineNumberReader
 特点:能跟踪行号
 // 写个方法看一下它的功能
 public static void fun1() throws FileNotFoundException, IOException {
        FileReader fr = new FileReader("/Users/lanou/Desktop/Test/znb.txt");
        LineNumberReader lnr = new LineNumberReader(fr);
        //设置行号
        lnr.setLineNumber(10);
        String string = "";
        While((string = lnr.read()) != null){
            System.out.println(lnr.getLineNumber() + ":" + string);
        }
        lnr.close();
    }       
}       

打印流

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

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

PrintWriter(字符输出)

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

//创建打印字符流
File file = new File("/Users/lanou/Desktop/Test/haha.txt");
    PrintWriter pw = new PrintWriter(file);
    pw.print("haha");
    pw.println(200);
    pw.println(false);
    pw.flush();
    pw.close();
//创建打印字节流
    File file = new File("/Users/lanou/Desktop/Test/haha.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.write(100);
    ps.print('p');
    //关闭资源
    ps.close();

//使用System.in 读取从键盘输入的数据 
public static void main(String[] args) throws IOException {
    System.out.println("请输入");
    InputStream in = System.in;
    //输入quit 让程序停止
    StringBuilder sb = new StringBuilder();
    int len = 0;
    while(true){
        if(sb.toString().endWith("quit")){
            break;
        }
        len = in.read();
        if(len == '\n'){
            System.out.println(sb.toString());
            sb.delete(0,sb.length());
        }else {
        sb.append((char)len);
        }
    }
}   
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页