以下是该方案。
public interface Processor{
public void create();
public void setDocuments();
public abstract void prepareDocuments();
}
public class ProcessorImpl implements Processor{
public void create(){
// Do something
}
public void setDocuments(){
// Do something
}
}
public class ProcessorA implements ProcessorImpl{
// this class will implement only once abstract
// method which is prepareDocuments()
public void prepareDocuments(){
// prepare documents..and also
// set the Documents list which will be checked by create()
// method and then index will be created.
}
}
public class IndexGenerator{
public static void main( String[] args){
ProcessorA a = new ProcessorAImpl();
a.create();
}
}
简要介绍....我正在开发一个通用框架来处理所有与Lucene索引相关的活动,包括创建索引,从索引中删除doc,更新并添加到索引中。除了创建文档之外,处理索引的所有逻辑都保持不变。每个索引都有不同类型的Document,因此我保留了prepareDocuments()方法的抽象,并为每个索引类型实现了它。
现在我想让所有的索引生成器类简单地创建一个像ProcessorA这样的特定索引处理器的实例并调用create()方法。但问题是create()方法总是找到文件列表为空/ null,尽管prepareDocuments通过调用setDocuments()方法来设置文档。我知道有一些设计缺陷,我真的需要寻求帮助形成OO大师。
由于 热心
答案 0 :(得分:1)
我不知道为什么你得到空/ null,因为没有足够的代码我们可以从中推断它。但是,对于你的问题,我会选择模板方法设计模式,例如在这里解析:http://en.wikipedia.org/wiki/Template_method_pattern
我认为这就是你想要做的事情。
顺便说一下。 implements
关键字仅用于接口。您尝试在此处使用它而不是extends
:
public class ProcessorA implements ProcessorImpl
答案 1 :(得分:0)
要详细说明关于模板的上一个答案(我完全同意),听起来你可能对调用setDocuments()的顺序有问题。模板方法模式的一个好处是强制调用不同方法(抽象或不抽象)的顺序。
你可以考虑像这样重组基类:
public interface Processor {
...
// This method orchestrates doc preparation by ensuring the correct
// ordering of method invocation, and calls the derived class impl
// method doPrepareDocuments()
public void prepareDocuments() {
// do document creation stuff here by calling
// appropriate methods (abstract or not)
setDocuments();
// implemented in derived classes to do specific document preparations
doPrepareDocuments();
}
public abstract void doPrepareDocuments();
...
}
这样,每个派生类实现都不必记住要采取的所有步骤,以及按什么顺序,而是关注它所知道的内容。这种方法增加了凝聚力。