簡體   English   中英

Java模板方法模式

[英]Java template method pattern

我試圖在一些JavaEE bean中按照模板方法模式的方式實現一些功能,這些JavaEE bean對數據集進行一些處理工作。

每個處理Bean都使用Job對象,執行一些工作,然后返回下一個Bean的更新的作業(總共約10個),每個Bean都有一個具有相同名稱的單個方法(doProcessing)和單個參數(job)

我想在每個bean'doProcessing'方法的開始和結束處執行一些日志記錄,以便在處理作業結束時包含來自每個bean的日志記錄信息(存儲在哈希圖中,諸如此類)

我當前的實現看起來像這樣...

@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,所以我無法弄清楚如何實現此功能,因此沒有構造函數。

有人可以提供一些指導嗎? 我在樹上叫錯了嗎?

如果我正確理解了您的問題,則可以嘗試以下操作:

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)感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM