java设计模式---装饰模式

6人阅读 评论(0) 收藏 举报
分类:


import java.io.FileReader;
import java.io.IOException;

public class MyBufferedReader {
	private FileReader fr;// 先要有个包装对象

	private char[] buf = new char[1024];// new一个缓存
	private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的)
	private int pos = 0;// 当前读取字符的位置
	public MyBufferedReader(FileReader fr) {//构造传参
		this.fr = fr;
	}
	
	/*从缓存中读取一个字符返回给调用方。
	 * 如果缓存中不存在字符数据,就用被包装对象fr
	 * 到磁盘中去读取一堆数据放到缓存中。
	 */
	public int read() throws IOException{
		if(count==0){//缓存是空的,必须到磁盘中加载
			count =fr.read(buf);
	        pos=0;
		}
		if(count<0){
			//已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做)
			return -1;
		}
		
		char c=buf[pos];
		count--;
		pos++;
		
		return c;
	}
	
    public String readLine() throws IOException{
    	StringBuilder sb=new StringBuilder();
    	int c=0;
    	while((c=read())!=-1){
    		char ch=(char) c;
    		if(ch=='\n'){
    			return sb.toString();
    		}
    		sb.append(ch);
    		}
    	
    	if(sb.length()!=0){//最后一行没有换行符,也要返回
    		return sb.toString();
    	}
    	return null;
    }
}

import java.io.FileReader;
import java.io.IOException;

public class MyBufferedReader {
	private FileReader fr;// 先要有个包装对象

	private char[] buf = new char[1024];// new一个缓存
	private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的)
	private int pos = 0;// 当前读取字符的位置
	public MyBufferedReader(FileReader fr) {//构造传参
		this.fr = fr;
	}
	
	/*从缓存中读取一个字符返回给调用方。
	 * 如果缓存中不存在字符数据,就用被包装对象fr
	 * 到磁盘中去读取一堆数据放到缓存中。
	 */
	public int read() throws IOException{
		if(count==0){//缓存是空的,必须到磁盘中加载
			count =fr.read(buf);
	        pos=0;
		}
		if(count<0){
			//已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做)
			return -1;
		}
		
		char c=buf[pos];
		count--;
		pos++;
		
		return c;
	}
	
    public String readLine() throws IOException{
    	StringBuilder sb=new StringBuilder();
    	int c=0;
    	while((c=read())!=-1){
    		char ch=(char) c;
    		if(ch=='\n'){
    			return sb.toString();
    		}
    		sb.append(ch);
    		}
    	
    	if(sb.length()!=0){//最后一行没有换行符,也要返回
    		return sb.toString();
    	}
    	return null;
    }
}

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.junit.Test;

public class TestMyBufferedReader {
	@Test//API中的BufferedReader---read()
	public void testread() throws IOException{
		FileReader fr=new FileReader("a.txt");
		BufferedReader bfr=new BufferedReader(fr);
		/*
		char c = (char) bfr.read();
		System.out.println(c);
		*/
		int c;
		while((c=bfr.read())!=-1){
			char ch=(char) c;
			System.out.print(ch);
		}
		System.out.println();
	}
	
	
	@Test//我们开发的MyBufferedReader---read()
	public void testMyRead() throws IOException{
		FileReader fr=new FileReader("a.txt");
	    MyBufferedReader mbr=new MyBufferedReader(fr);
	    /*
		char c = (char) bfr.read();
		System.out.println(c);
		*/
	    int c;
	    while((c=mbr.read())!=-1){
	    	char ch=(char) c;
	    	System.out.print(ch);
	    }
	    System.out.println();
	}
	
	@Test//API中的BufferedReader---readLine()
	public void testReadLine() throws IOException{
		FileReader fr=new FileReader("a.txt");
		MyBufferedReader br=new MyBufferedReader(fr);
		
		String str=null;
		while((str=br.readLine())!=null){
			System.out.print(str);
		}
		System.out.println();
	}
	
	@Test//MyBufferedReader---readLine()
	public void testMyReadLine() throws IOException{
		FileReader fr=new FileReader("a.txt");
		MyBufferedReader br=new MyBufferedReader(fr);
		
		String str=null;
		while((str=br.readLine())!=null){
			System.out.print(str);
		}
		System.out.println();
	}
}
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
//v2版本: 只是包装InputStreamReader类
public class MyBufferedReader {
	private InputStreamReader fr;// 先要有个包装对象

	private char[] buf = new char[1024];// new一个缓存
	private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的)
	private int pos = 0;// 当前读取字符的位置
	public MyBufferedReader(InputStreamReader fr) {//构造传参
		this.fr = fr;
	}
	
	/*从缓存中读取一个字符返回给调用方。
	 * 如果缓存中不存在字符数据,就用被包装对象fr
	 * 到磁盘中去读取一堆数据放到缓存中。
	 */
	public int read() throws IOException{
		if(count==0){//缓存是空的,必须到磁盘中加载
			count=fr.read(buf);
	        pos=0;
		}
		if(count<0){
			//已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做)
			return -1;
		}
		
		char c=buf[pos];
		count--;
		pos++;
		
		return c;
	}
	
    public String readLine() throws IOException{
    	StringBuilder sb=new StringBuilder();
    	int c=0;
    	while((c=read())!=-1){
    		char ch=(char) c;
    		if(ch=='\n'){
    			return sb.toString();
    		}
    		sb.append(ch);
    		}
    	
    	if(sb.length()!=0){//最后一行没有换行符,也要返回
    		return sb.toString();
    	}
    	return null;
    }
}


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.junit.Test;

public class TestMyBufferedReader {
	@Test//API中的BufferedReader---read()
	public void testread() throws IOException{
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		BufferedReader br = new BufferedReader(isr);
		/*
		char c = (char) isr.read();
		System.out.println(c);
		*/
		int c;
		while((c=isr.read())!=-1){
			char ch=(char) c;
			System.out.print(ch);
		}
		System.out.println();
	}
	
	
	@Test//我们开发的MyBufferedReader---read()
	public void testMyRead() throws IOException{
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		MyBufferedReader br = new MyBufferedReader(isr);
	    /*
		char c = (char) bfr.read();
		System.out.println(c);
		*/
	    int c;
	    while((c=isr.read())!=-1){
	    	char ch=(char) c;
	    	System.out.print(ch);
	    }
	    System.out.println();
	}
	
	@Test//API中的BufferedReader---readLine()
	public void testReadLine() throws IOException{
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		BufferedReader br = new BufferedReader(isr);
		
		String str=null;
		while((str=br.readLine())!=null){
			System.out.print(str);
		}
		System.out.println();
	}
	
	@Test//MyBufferedReader---readLine()
	public void testMyReadLine() throws IOException{
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		MyBufferedReader br = new MyBufferedReader(isr);
		
		String str=null;
		while((str=br.readLine())!=null){
			System.out.print(str);
		}
		System.out.println();
	}
}
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
//v3版本: 最终版,能够兼容所有Reader
public class MyBufferedReader extends Reader{
	//★
	private Reader r;//要拥有一个被包装对象

	private char[] buf = new char[1024];// new一个缓存
	private int count = 0;// 记录当前缓存中字符的个数(指没有被外面读取的)
	private int pos = 0;// 当前读取字符的位置
	public MyBufferedReader(Reader r) {//构造传参
		this.r = r;
	}
	
	/*从缓存中读取一个字符返回给调用方。
	 * 如果缓存中不存在字符数据,就用被包装对象r
	 * 到磁盘中去读取一堆数据放到缓存中。
	 */
	public int read() throws IOException{
		if(count==0){//缓存是空的,必须到磁盘中加载
			count=r.read(buf);
	        pos=0;
		}
		if(count<0){
			//已经没有数据了,连磁盘中也读完,返回-1 (API也是这么做)
			return -1;
		}
		
		char c=buf[pos];
		count--;
		pos++;
		
		return c;
	}
	
    public String readLine() throws IOException{
    	StringBuilder sb=new StringBuilder();
    	int c=0;
    	while((c=read())!=-1){
    		char ch=(char) c;
    		if(ch=='\n'){
    			return sb.toString();
    		}
    		sb.append(ch);
    		}
    	
    	if(sb.length()!=0){//最后一行没有换行符,也要返回
    		return sb.toString();
    	}
    	return null;
    }

	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		return r.read(cbuf, off, len);
	}
	@Override
	public void close() throws IOException {
		r.close();
	}
}

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.junit.Test;
//这个类和v1,v2版本都完全相同,没有变化
public class TestMyBufferedReader {
	@Test//我们开发的MyBufferedReader---read()
	public void testMyRead() throws IOException{
		FileReader fr = new FileReader("a.txt");
		MyBufferedReader br = new MyBufferedReader(fr);
	    /*
		char c = (char) bfr.read();
		System.out.println(c);
		*/
	    int c;
	    while((c=br.read())!=-1){
	    	char ch=(char) c;
	    	System.out.print(ch);
	    }
	    System.out.println();
	}
	
	
	@Test//MyBufferedReader---readLine()
	public void testMyReadLine() throws IOException{
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		MyBufferedReader br = new MyBufferedReader(isr);
		
		String str=null;
		while((str=br.readLine())!=null){
			System.out.print(str);
		}
		System.out.println();
	}
}




查看评论

【Java设计模式】- 装饰器模式

概述     装饰器模式:可以动态的为运行时的类添加行为。相比继承而言,继承是直接对某个类的行为进行扩展而装饰器模式是对某个对象进行扩展。     原理:增加一个修饰类去实现被修饰类相同的接口,同...
  • LightOfMiracle
  • LightOfMiracle
  • 2017年06月26日 10:32
  • 327

大话设计模式—装饰模式

装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有...
  • lmb55
  • lmb55
  • 2016年03月26日 09:21
  • 1213

Java:一夜一发设计模式(一)------装饰者模式

一,什么时候使用装饰者模式?比如有一家店卖饮品,饮品就有不少种,每一种还可以加项,比如给可乐加冰,加糖,兑水什么的,每次加项的价格还不同,就会将代码弄的很繁琐,这种情况下就可以使用装饰者模式来实现. ...
  • android_zyf
  • android_zyf
  • 2017年03月30日 01:53
  • 741

java二十三种设计模式------(一)装饰模式 装饰类VS子类继承

Decorator(装饰者模式),顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。        因此,装饰器模式具有如下的特征: 1,它必须具有一个装饰的对象。(就如...
  • qiushi_1990
  • qiushi_1990
  • 2014年08月04日 14:11
  • 1396

浅谈JAVA设计模式之——装饰模式(Decorator)

一、概述 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、适用性 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 2.处...
  • l1028386804
  • l1028386804
  • 2015年05月03日 23:56
  • 2356

用Java 8 Lambda表达式实现设计模式:命令模式

在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 。命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化...
  • u012151556
  • u012151556
  • 2015年10月12日 13:45
  • 658

java设计模式之装饰模式代理模式区别

初次看装饰模式的时候首先想到了上节讲的代理模式,代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。 各用一句话描述两个模式应该是这样的: 装...
  • crazy_meng
  • crazy_meng
  • 2016年04月13日 15:33
  • 1781

JAVA设计模式之 装饰模式【Decorator Pattern】

一、概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继...
  • l416112167
  • l416112167
  • 2015年03月09日 21:07
  • 2159

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 3155

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 19907
    个人资料
    持之以恒
    等级:
    访问量: 2571
    积分: 951
    排名: 5万+
    文章存档
    最新评论