首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java模板方法模式

Java模板方法模式
EN

Stack Overflow用户
提问于 2014-11-19 22:16:41
回答 1查看 293关注 0票数 0

我试图在一些JavaEE bean中实现一些类似于模板方法模式的东西,这些bean在dataset上做了一些处理工作。

每个处理bean接受作业对象,然后为下一个bean返回更新的作业(总计约10个),每个bean都有一个名称相同的方法(doProcessing)和一个参数( Job )

我希望在每个bean 'doProcessing‘方法的开始和结束时执行一些日志记录,以便在处理结束时作业包含来自每个bean的日志信息(存储在hashmap或类似的)

我现在的实现是这样的..。

代码语言:javascript
复制
@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)

    }

}

但是我知道我可以做得更好,使用继承,我应该能够创建一个类似于……的超类。

代码语言:javascript
复制
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
    }

}

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

代码语言:javascript
复制
@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是@无状态的,因此没有构造函数,所以我一直无法精确地实现这一点。

有人能在这方面提供一些指导吗?我撞错树了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 22:39:50

如果我正确理解了你的问题,你可以尝试以下几点:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27028123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档