Jive中的设计模式问题

最近看了Jive的源码,感觉收获极大。就想把一些方法在我们的项目中应用,但是遇到了一些问题,请各位大虾指教!
Jive 中针对论坛中的对象定义了一系列的接口,比如:Forum,ForumThread,ForumMessage等,通过ForumFactory可以创建这些对象。然后Jive针对这些接口做了数据库的实现,比如DbForum,DbFrumThread,DbForumMessage,DbForumFactory等,这样创建对象的话必须要通过工厂。

但是这些工厂创建的都是比较简单的对象,比如对于DbForum,用户的输入可能就是name和description,因此,创建论坛的方法是
Forum createForum(String name, String description) ,用户拿到Forum对象以后,可以调用一些方法来更改对象,比如:
setModifiedDate(Date modifiedDate),该方法会调用saveToDb()来更新数据表中的纪录。
但是创建复杂的对象这样做是否合适,比如有下面的对象:
class A
{
String name;
Vector v; //v中保存的是一系列b对象
}
class B
{
String name
.....
}
这时候工厂方法是不是就不太适用了?

另外在DbForum中setName,setDescription,setCreationDate等方法都要调用saveToDb来更新数据库,因为用户的修改可能大多是

setName,setDescription,这样做代价也许并不是很大,但是如果一个对象需要频繁更新,比如上面的class A有很多成员变量,都需

要更新,并且更新的代价很高(例如需要保存到文件中),这时候怎么办?我的想法是在class A中设置一个save()方法,对一个对

象做完所有的修改后再调用该方法,把对象进行持久化,但是程序员可能经常忘了调用该方法。有什么好的模式来解决?

一个DbForum对象在用户关心的可能只是name和description,因此通过jsp可以很容易的把DbForum对象显示出来,并且获取用户的输入,进行修改。复杂的对象在浏览器中如何呈现?如何获取用户的输入进行修改?通过一些表单来传递参数可能太复杂,太繁琐了。

工厂方法主要是为了创建对象而不是保存对象,一系列的B对象的存储不一定要放在工厂内,但是这些对象的创建可以通过工厂。

在A内增加save方法操作B类增加了耦合性,我觉得可以在B中定义save方法来集中处理持久化,程序员忘了调用,呵呵,程序bug。

关于“程序员可能经常忘了调用该方法。”,可以使用接口封装方法,把save放在接口中,如果想做得更绝一点,将A类的获得等操作封装在工厂模式中,哈哈,再笨的程序员也应该知道了。

关于表单参数传递,参考Struts的FormAction.

我认为,jive的持续化层很滥的,别再去学了~~.自己想办法加入个持续化层才是正道.

呵呵,再补充一点,不管什么持续化层,代码都是很sb的.只是在模块层次上比原来的要清晰点而已.

"可以使用接口封装方法,把save放在接口中,如果想做得更绝一点,将A类的获得等操作封装在工厂模式中"
这句话我不太明白,能不能详细的解释一下?多谢!

采用value object的设计模式,不提供对单个属性的set方法,只提供setXXXVO(VO)的方法就行了

to onlylx
参考这个Value Object变种:


public class SignIn {

private final static String sql =
"SELECT userid,password FROM password WHERE userid=? AND password = PASSWORD(?)";

private String action = null;
private String userid = null;
private String password = null;

public String getAction() {
return action;
}

public void setAction(String action) {
this.action = action;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public boolean validate() {
if (userid == null || userid.length() <= 0)
return false;

if (password == null || password.length() <= 0)
return false;

return true;
}

public boolean SignIn() {
boolean check = false;
Mysql mysql = new Mysql(sql);
try {
mysql.setString(1, userid);
mysql.setString(2, password);
ResultSet rs = mysql.executeQuery();
if (rs.next()) {
check = true;
}
} catch (Exception e) {
System.err.println(e);
}
finally {
mysql.close();
mysql = null;
}
return check;
}

}

SignIn() 方法就是你的save方法,别人用这个类后,马上就明白需要实现行为SignIn()或save才能达到真正目的。
这段代码是我主页上 资料栏目中的用户注册系统代码。

如果你还想进一步声明,做成接口如下:


public interface SignInIF {

public boolean save();

}

然后让Sign继承该接口,这样通过接口反复声明了该类的灵魂是save()方法。

当然,也可以声明那些setXXXX或getXXXX方法。


多谢banq

对于每个set都调用saveToDB方法的设计我觉得比较符合实际的使用情况,因为用户的修改动作一般都是针对少数的几个属性,大多数的时候是针对一个属性进行修改。

really good!

请问Value Object变种:是什么意思?