我的OO设计需要帮助

时间:2012-04-23 05:56:44

标签: oop class

以下是该方案。

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大师。

由于 热心

2 个答案:

答案 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();
    ...
}

这样,每个派生类实现都不必记住要采取的所有步骤,以及按什么顺序,而是关注它所知道的内容。这种方法增加了凝聚力。