/*
MyReader //专门用于读取数据的类。
|--MyTextReader
|--MyBufferedTextReader //缓冲区的
|--MyMediaReader
|--MyBufferedMediaReader//缓冲区的
|--MyDataReader
|--MyBufferDataReader//缓冲区的
上面的这个类扩展性很差
找到其参数的共同类型,通过多态的形式,可以提高扩展性。
//优化后的体系
MyReader //专门用于读取数据的类。
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferedReader //其功能都是基于上面的类
装饰模式比类继承要灵活,避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常都是属于一个体系中的。
实际使用中:
通过装饰来增强原有代码的功能,它的灵活比如说你有一个对象是以有建立的。
现在想感觉这个功能不够用了,这时不要用继承,而是使用装饰。这时再写个类
把原的对象传进来就可以了。当写的功能有问题时,可以直接去掉,再使用原来
的功能,依然可以使用。灵活性更强。
读取并显示行号:
*/
import java.io.*;
class MyLineNumberReader
{
private Reader r;
int num = 0;
MyLineNumberReader(Reader r)
{
this.r = r;
}
public String getNumberLine()throws IOException
{
StringBuilder sb = new StringBuilder();
num++;
int ch ;
while((ch = r.read()) != -1)
{
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 setNum(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
public void myClose() throws IOException
{
fr.close();
}
}
class MyLineReaderDemo
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("MyLineReaderDemo.java");
MyLineNumberReader mr = new MyLineNumberReader(fr);
String str;
while((str = mr.getNumberLine()) != null)
System.out.println(mr.getNum()+str);
mr.myClose();
}
}
设计模式:装饰模式的原理及代码演示
最新推荐文章于 2023-03-31 16:38:43 发布