您的位置:首页 > 职场人生

黑马程序员 —— 装饰设计模式

2014-12-19 10:52 218 查看
-----------android培训java培训、java学习型技术博客、期待与您交流!------------

1、简述

装饰模式(decoratr) 又名包装(Wrapper)模式,它是对已有对象的功能进行加强时定义的一个类,将已有对象传入,使其功能加强。是继承关系的一个替代方案。

2、装饰和继承的区别:

A 、装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。因此,装饰模式比继承灵活,降低了类与类之间的关系。

B、装饰模式扩展的是对象的功能,不需要增加类的数量,所以装饰类和被装饰的类通常都是属于一个体系。而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。

示例:
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
*自定义一个类来实现和readLine功能一样的方法
* @author Administrator
*/
public class MyBufferedReader extends Reader
{
private Reader r;
public MyBufferedReader(Reader r)
{
this.r = r;
}
//可以一次读取一行数据的方法
public String myReadLine() throws IOException
{
//定义一个临时容器,原bufferedreader封装的是字符数组
//定义一个StringBuilder容器,因为最终还是要将数据变成字符串。
StringBuilder sb = new StringBuilder();
int ch = 0;
while (-1 !=(ch = r.read()))
{
if (ch =='\r') //是\r就不存入缓冲区中,继续。
continue;
if (ch =='\n')
return sb.toString();
else
sb.append((char)ch); //存入缓冲区
}
//等于0 表示缓冲区中右数据
if (sb.length() !=0)
{
return sb.toString();
}
return null;
}
/*
* 覆盖Reader类中的抽象方法
*/
public int read(char[] chuf,int off,int len) throws IOException
{
return r.read(chuf,off,len);
}

public void  close() throws IOException
{
r.close();
}
// 覆盖Reader类中的抽象方法

//关闭程序
public void  myClose() throws IOException
{
r.close();
}
}

class MyBufferedReaderTest
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("C:\\buf.txt");

MyBufferedReader myBuf = new MyBufferedReader(fr);

String line = null;

while (null != (line = myBuf.myReadLine()))
{
System.out.println(line);
}
myBuf.myClose();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: