Java---设计模式---装饰

标签: Java 设计模式 装饰
37人阅读 评论(0) 收藏 举报
分类:

场景和问题

    在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?

MyBufferedReader:

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

/**
 * Time:2018/4/15
 * Description:
 * 装饰:
 * 	   在不对原有对象类进行修改的基础上,给一个或多个已有的类对象提供增强额外的功能。
 * 通过模仿API中的BufferedReader,进行学习装饰模式。
 * @author 宋进宇
 */
public class MyBufferedReader extends Reader {
	private Reader reader; //被加强的对象
	private char[] cbuf = new char[1024];//表示缓存区,大小为1K
	private int size = 0; //表示缓存区中字符的个数
	private int pos = 0; //表示当前读到缓存区的哪个位置
	
	//既然是加强已有类的功能,那么,我们就必须需要从构造方法中接收一个需要加强的类对象
	public MyBufferedReader( Reader reader) {
		this.reader = reader;
	}
	/**
	 * 读一个字符
	 * @return 是一个用int表示一个char字符,如果是0-65535,那么就说明还有数据,如果是-1说明没有数据了
	 * @throws IOException 
	 */
	public int read() throws IOException{//如果出异常需要抛出,把决策权留给调用者
		if(size==pos){//如果size==pos说明缓存区中数据已读完,需要从新加载数据
			size = reader.read(cbuf);
			pos=0;//从缓存区0的位置开始度读
		}
		if (size==-1) {
			return -1;
		}
		return cbuf[pos++];
	}
	//测试MyBufferedReader中的read()方法
//	public static void main(String[] args)throws IOException {//为了测试代码结构清晰,抛出理异常
//		MyBufferedReader mbr = new MyBufferedReader(new FileReader("a.txt"));
//		int c;
//		while((c=mbr.read())!=-1){
//			System.out.print((char)c);
//		}
//	}
	/**
	 * 读一行字符
	 * @return 是一个字符串,表示读一行字符串,如果返回值为null,说明已经读完。
	 */
	public String readLine() throws IOException{
		StringBuilder sb = new StringBuilder();//因为是对字符串不断修改,采用StringBuilder,比较快,且省资源
		int c;
		while((c=read())!=-1){
			char ch = (char)c;//注意需要转换
			if (ch=='\r') {//回车,去掉
				continue;
			}
			if (ch=='\n') {
				return sb.toString();
			}
			sb.append(ch);
		}
		if (sb.length()>0) {//预防最后一行没有换行符'\n'
			return sb.toString();
		}
		return null;
	}
	//测试MyBufferedReader中的readLine()方法
	public static void main(String[] args) throws IOException {//为了测试代码结构清晰,抛出理异常
		MyBufferedReader mbr = new MyBufferedReader(new FileReader("a.txt"));
		String str;
		while((str = mbr.readLine())!=null){
			System.out.println(str);
		}
	}
	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		return reader.read(cbuf, off, len);
	}
	@Override
	public void close() throws IOException {
		reader.close();
	}
}

查看评论

java设计模式(1)-------单例,工厂,值对象,装饰模式

java设计模式
  • u011459262
  • u011459262
  • 2015-08-20 00:10:37
  • 2976

设计模式--装饰者模式与代理模式

这次主要总结下装饰着模式和代理模式,这两个一起进行总结,主要是因为两个设计模式特别的类似。先依次说一下两个设计模式,然后再说下两个模式的不同。...
  • u013159433
  • u013159433
  • 2016-05-25 17:11:25
  • 1646

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

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

大话设计模式—装饰模式

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

JAVA设计模式初探之装饰者模式

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...
  • jason0539
  • jason0539
  • 2014-04-01 09:07:37
  • 79500

设计模式汇总:结构型模型(上)

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、...
  • woliuyunyicai
  • woliuyunyicai
  • 2016-05-12 10:11:43
  • 5552

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

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

java设计模式--装饰者模式(Decorater Pattern)

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象以下情况使用Decorator模式 1. 需要扩展一个类的功能,或给一个...
  • coding_man_xie
  • coding_man_xie
  • 2015-11-03 21:24:46
  • 1016

Java IO-InputStream家族 -装饰者模式

在学习java.io.*包的时候,InputStream那一群类很让人反感,子类繁多,使用起来也非常奇怪。我们想以缓存的方式从文件中读取字节流。要先创建一个FileInputStream,然后放入Bu...
  • pomony1
  • pomony1
  • 2017-05-30 11:01:55
  • 1675

<三>读<<大话设计模式>>之装饰模式

学习这个模式比前几个要难点了,搞了半天才弄懂。好吧,也许是我脑子慢        装饰者模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是...
  • jzhf2012
  • jzhf2012
  • 2014-10-27 14:06:35
  • 1742
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 2万+
    积分: 3337
    排名: 1万+
    博客专栏
    ACM

    文章:239篇

    阅读:19102
    Java

    文章:37篇

    阅读:1571
    文章存档