我想建立一个多层缓冲区:
public class Buffer{
protected void onReadComplete(int read){
//...
// throw new RuntimeException(...);
}
public void read(...){
//...
//...
onReadCompleted(some);// we can throw RuntimeExceptions here without corrupt the field mAlreadyRead.
mAlreadyRead+=some;
return;
}
protected void checkRead(...) throws Exception{
//...
}
}
在第一层(子类)中,您可以这样做:
Buffer lowlevel=new Buffer(){
@Override
protected void onReadComplete(int read){
super.onReadComplete(read);
//...
}
@Override
Protected void checkRead(){
//...
}
};
然后,每当访问实例 lowlevel 时,您将通过覆盖的 lowlevel.onReadComplete 例程获得通知。但后来我想将此缓冲区传递给我程序的另一部分。这里的问题是“我的程序的另一部分”不能只新建一个实例并覆盖 Buffer 中的方法,它只获取 Buffer 的一个实例。如何覆盖该实例中的方法以添加更多层?我想要的是:
Buffer higherLevel=lowlevel{
@Override
protected void onReadComplete(int read){
super.onReadComplete(read);
//...
}
}
但是当然java不会让我知道......
但是,java 确实提供了 Proxy。但我希望有一种干净、统一、低开销、关注性能的方式来做到这一点。
而且我们不能添加回调接口:
public class BufferWrapper{
IEventBuffer event;
public read(...){
//...
event.onReadComplete(...);
//...
}
public BufferWrapper(Buffer buffer,IEventBuffer event){
buffer.event=event;
}
}
当通过higherLevel访问时,我们在两者上都触发onReadComplete,但是当通过lowlevel访问时,我们只触发lowlevel.onReadComplete。
我们不能使用这种方法:
Buffer higherLevel=new Buffer(lowlevel){
@Override
protected void onReadComplete(int read){
super.onReadComplete(read);
//...
}
}
因为 onReadComplete 发生在 read(...) 的中间,我不想再次实现读取。
请原谅我的英语不好,我不知道我是否表达了我的观点:
...我已经制作了插图图片,但我无法发布图片... -->a 表示通过实例 a 访问
<pre>
-->lo---------------------------------->lo.onXXX
----------> hi1-->hi1.onXXX----------->lo.onXXX
----------> hi2-->hi2.onXXX----------->lo.onXXX
--> hi3--> hi2--> hi3.onXXX,hi2.onXXX->lo.onXXX
</pre>