【发布时间】:2011-11-08 10:12:58
【问题描述】:
我无法在以下两种模式之间做出决定,例如。保存一个dataObject(在我的例子中是bean)。这两个选项是:
第一
abstract class DataService {
protected void save(Object data){
//persist the data
}
}
//the service for Project objects
class ProjectService extends DataService {
public void saveProject(Project prj, Object... args /*other save options*/ ){
// some preprocessing, checking, validation
save(prj); //call the method in DataService
// do postprocessing
}
}
//calling save
projectService.saveProjec(project, /*some args*/);
第二次
abstract class DataService {
public void save(Object data){
if(beforeSave(data)){
// persist the data
afterSave(data);
}
}
protected boolean beforeSave(){
return true;
}
protected void afterSave(){
}
}
//the service for Project objects
class ProjectService extends DataService {
public initSave(Object... args /*other save options*/ ){
// store these options in class properties
}
@Override
protected bool beforeSave(Project objectAboutToBeSaved){
// some preprocessing, checking, validation
// use class properties set by initSave if needed
return true;//if we want to continue with the saving procedure
}
@Override
protected bool afterSave(Project savedObject){
// do postprocessing
// use class properties set by initSave if needed
}
}
//calling save
projectService.initSave(/*some args*/);
projectService.save(project);
目前我们使用的是第一种模式,但我开始考虑改用第二种模式,因为:
(优点)
- 更好的逻辑分离
- 跨多种对象类型的统一方法命名(允许创建通用单元测试:例如,初始化每个对象及其服务并调用 save)
(缺点)
- 设置起来有点困难 (initSave) - 甚至可能需要包含拆卸方法
我的想法来自CakePHP MVC 框架,其中 Model 和 Controller 都包含这样的回调方法,使用它们我可以真正实现一些清晰的业务逻辑。
现在我正在用 Java 开发 - Spring + Spring Data Graph -(因此是 javaish 代码),但在我看来,这个问题可能是一个非常普遍的问题。
注意:这个例子是为保存而给出的,但删除过程也是如此。
【问题讨论】:
标签: java design-patterns save