Java模板方法模式

时间:2014-11-19 22:16:42

标签: java java-ee inheritance template-method-pattern

我正在尝试在一些JavaEE bean中实现模板方法模式的某些东西,这些bean在数据集上进行一些处理工作。

每个处理bean获取Job对象,然后执行一些工作然后返回下一个bean的更新作业(总共大约10个),每个bean都有一个具有相同名称的单个方法(doProcessing)和单个参数(job)< / p>

我想在每个bean的开头和结尾执行一些日志记录&#39; doProcessing&#39;方法,以便在处理结束时,Job包含来自每个bean的日志信息(存储在hashmap或类似的中)

我目前的实现看起来像这样......

@Stateless
public class processingTaskOne(){

    public void doProcessing(Job job){

        //always called at beginning of method
        String beanReport = "Info from Task 1: ";

        for(int i=0; i<job.getDataArray().size();i++){
            beanReport+="\n some more info";
            //Do some processing work here
        }

        //always called at end of method
        job.addNewReportSection(beanReport)

    }

}

但我知道我可以做得比这更好,使用继承我应该能够创建一个超级类... ...

public abstract class Reportable{

    private String sectionReport;

    public void preProcessing(Job job){
        //Setup bean report, use reflection to get subclass name 
    }

    public void postProcessing(Job job){
        //Finish bean report and append to job
        job.addNewReportSection(sectionReport)
    }

    public abstract doProcessing(){
        //not sure how this should work
    }

}

任何扩展超类的类都会自动执行前/后处理操作......

@Stateless
public class processingTaskOne() extends Reportable{

    public void doProcessing(Job job){

        for(int i=0; i<job.getDataArray().size();i++){

            super.sectionReport += "log some info"
            //Do some processing work here

        }

    }

}

但我一直无法弄清楚如何完全实现这一点,因为所有的例子都引用了POJO,因为我的bean是@Stateless,所以没有构造函数。

有人可以为此提供一些指导吗?我吠叫错了树吗?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您可以尝试以下方法:

public abstract class Reporting {
  public void setUp(Job job) {
    // set things up
  }

  public void tearDown(Job job) {
    // post-processing stuff
  }

  public void process(Job job) {
    setUp(job);
    doProcessing(job);
    tearDown(job);
  }

  public abstract void doProcessing(Job job);
}

public class Processor1 extends Reporting {
  @Override
  public void doProcessing(Job job) {
    // business logic
  }
}

以后,在代码的某处,您应该调用doProcessing(),而不是基类的process()方法。

此外,如果我的解释是正确的,您可能有兴趣使用一些面向方面的编程框架,如AcpectJ或Spring AOP。