2009-08-14 64 views
3

我可以知道如何創建childClass如果我的childClass方法getInfoFromDB()和saveToDB()需要做不同的邏輯?模板方法模式

public abstract class BaseClass { 
    public abstract Object doTransaction(); 
    public Object executeTrans() { 
      //do something 
      tx.begin();    
      this.doTransaction(); 
      tx.commit(); 

    } 
} 
public childClass extends BaseClass{ 
    @Override 
    public Object doTransaction(){ 
     //overide to get something from database so can only be used for getInfoFromDB() and not for saveToDB() 
     return something; 
    } 
    public List<String> getInfoFromDB(){ 
     super.executeTrans(); 
    } 
    public void saveToDB(){ 
     super.executeTrans() ; 
    } 
} 

回答

4

你應該在這種情況下使用的模板圖案,像這樣:

public abstract class BaseClass 
{  
    public Object executeTrans(Template template) 
    { 
    tx.begin();    
    template.doTransaction(); 
    tx.commit();  
    } 
} 

public interface Template 
{ 
    public void doTransaction(); 
} 

public childClass extends BaseClass 
{ 
    public List<String> getInfoFromDB() 
    { 
    executeTrans(
     new Template() 
     { 
     public void doTransaction() 
     { 
      ...do get info from DB here. 
     } 
     } 
    ); 
    } 

    public void saveToDB() 
    { 
    executeTrans(
     new Template() 
     { 
     public void doTransaction() 
     { 
      ...do save to DB here. 
     } 
     } 
    ); 
    } 
} 

話說,我建議使用Spring JDBC的模板類,而不是滾動您自己 - 他們已經已經過嘗試和測試,並已解決了嵌套事務中遇到的問題等。

+0

請糾正我,如果我錯了。通過讓childClass擴展BaseClass; saveToDB()和getInfoFromDB()的executeTrans()方法將調用相同的executeTrans()的tx.begin和tx.close()。這會好嗎?或者它應該是單獨的新時刻? – cometta 2009-08-14 08:49:01

+0

我可否知道你放在那裏的「模板」類型是什麼? – cometta 2009-08-14 08:52:02

+0

是模板類,只是看起來像這樣 - > class Template(){public void doTransaction(){}; }? – cometta 2009-08-14 09:00:46

1

將包含不同邏輯的Runnable傳遞給executeTrans()方法。

但是,我不確定模板方法模式是否真的是您在這裏需要的(以及它如何處理回滾?)。您可能希望查看允許declarative transactions的框架,例如Spring。

1

尼克, 我打算使用的「tx」如下所示。從代碼,最好的做法來看,是生命週期是確定的,因爲它是由兩個savetodb()和getinfofromdb(叫)

public abstract class BaseClass 
{  
    public Object executeTrans(Template template) 
    { 
     // PersistenceManager pm = ...; 
     Transaction tx = pm.currentTransaction(); 
     try { 
      tx.begin(); 
      template.doTransaction(); 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 

    } 
} 
+0

我對JDO不是很瞭解(我認爲這就是你正在使用的),但除了finally塊之外,它看起來是正確的 - 儘管這可能會起作用,如果發生異常,我會進行回滾。 – 2009-08-14 09:51:52