【问题标题】:Java template method patternJava模板方法模式
【发布时间】:2014-11-20 06:39:50
【问题描述】:

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

每个处理 bean 接受 Job 对象,做一些工作然后为下一个 bean 返回更新后的作业(总共大约 10 个),每个 bean 都有一个同名的方法(doProcessing)和单个参数(job)

我想在每个 bean 'doProcessing' 方法的开始和结束时执行一些日志记录,以便在处理结束时作业包含来自每个 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,因此没有构造函数。

有人可以提供一些指导吗?我是不是找错树了?

【问题讨论】:

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


    【解决方案1】:

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

    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。

    【讨论】:

    • 是的,你没问题,但我遇到的问题是我的 bean 有一个接口(它们是 EJB bean),因此调用的是接口而不是实际的 bean,并且接口无法访问super.process() 方法...知道如何解决这个问题(不删除接口!)
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2013-01-11
    相关资源
    最近更新 更多