装饰设计模式、LineNumberReader

装饰设计模式:

 当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类就成为装饰类。

特点:装饰类通常会通过构造函数接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

例如:

public class MyBufferedReader  {
private Reader r;
    public MyBufferedReader(Reader r) {
super();
this.r = r;
}
//可以一次读取一行的方法
public String myReadLine() throws IOException
{
//定义一个临时容器。StringBulider容器,应用于存储字符数组
StringBuilder sb=new StringBuilder();
int ch=0;
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;
}
//复写reader中的抽象方法
//复写close方法
public  void  close() throws IOException
{
r.close();
}
//复写read方法
public int read (char[] c,int off,int len) throws IOException{
return r.read(c, off, len);
}
}

装饰和继承的区别:

装饰模式比继承要灵活,避免了继承体系臃肿。而且降低了类与类之间的关系。装饰类因为是增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常都属于一个体系中的。

MyReader专门由于读取数据的类,

LineNumberReaderBufferedReader子类)

跟踪行号的缓冲字符输入流。

方法:setLineNumber(int):设置当前行号。

getLineNumber():获取当前行号。

默认情况下,行编号从0开始,该行号随数据读取在每个行结束符处递增,并可以通过调用setLineNumber更改行号,但是,setLineNumber不会实际更改流中的当前位置,它主要更改将由getLineNumber()返回的值。

练习:模拟一个带行号的缓冲区对象。

class MyLineNumberReader{

private Reader reader;

private int lineNumber;

public MyLineNumberReader(Reader reader){

this.reader=reader;

}

public String MyReadLine() throws IOException{

lineNumber++;//每读取一行时,行数自动加1一次

StringBuilder sb=new StringBuilder();

int ch=0;

while((ch=reader.read())!=-1){

if(ch=='\r')

continue;

if(ch=='\n')

return sb.toString();

sb.append((char)ch);

}

if(sb.length()!=0)

return sb.toString();

return null;

}

public void setLineNumber(int lineNumber){//设置行号

this.lineNumber=lineNumber;

}

public int getLineNumber(){//获取行号

return lineNumber;

}

public void myClose() throws IOException{

reader.close();

}

}

程序优化:由于缓冲区BufferedReader中已经实现了readLineclose方法,且在模拟读取字符流缓冲区时也自定义实现了readLineclose方法,在模拟带行号的缓冲对象时,再次实现readLineclose,代码重复,所以继承BufferedReader或者自定义的缓冲区类,可以减少代码的重复。

优化后的代码:

class MyLineNumberReader extends MyBufferedReader {

private int lineNumber;

public MyLineNumberReader(Reader r){

super(r);

}

public String MyReadLine() throws IOException{

lineNumber++;//每读取一行时,行数自动加1一次

return super.MyReadLine();

}

public void setLineNumber(int lineNumber){//设置行号

this.lineNumber=lineNumber;

}

public int getLineNumber(){//获取行号

return lineNumber;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰器模式是一种结构型设计模式。它允许你在运行时给对象动态地添加功能,而无需修改其源代码。在 Java 中,装饰器模式通常使用继承来实现。 该模式最常见的例子是 Java 的 IO 库,如 BufferedReaderLineNumberReader装饰。这些装饰通过继承和组合,可以在现有的 IO 上添加新的功能。 下面是一个装饰器模式的示例: public interface Component { void operation(); } public class ConcreteComponent implements Component { @Override public void operation() { System.out.println("具体组件的操作。"); } } public class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } @Override public void operation() { component.operation(); } } public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } @Override public void operation() { super.operation(); addBehavior(); } private void addBehavior() { System.out.println("具体装饰的新方法。"); } } 在这个示例中,Component 是一个抽象接口,定义了 operation() 方法。ConcreteComponent 是一个具体的组件,实现了 Component 接口。 Decorator 是一个装饰,实现了 Component 接口。它包含一个 Component 对象,通过调用 operation() 方法来实现相同的操作。 ConcreteDecorator 是一个具体的装饰,包含一个 Component 对象,并在调用其 operation() 方法后添加了新的行为。 使用该模式可以动态地添加新功能,同时避免代码的修改,对代码的可维护性和扩展性有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值