2009-08-14 86 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