JiveJdon Community Forums
在线121人 J道首页 | 论坛首页 | 培训咨询 | 开源框架 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 11 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
onlylx

发表文章: 7
注册时间: 2003年06月26日 22:09
Jive中的设计模式问题 发表: 2003年06月26日 22:13 回复
最近看了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对象显示出来,并且获取用户的输入,进行修改。复杂的对象在浏览器中如何呈现?如何获取用户的输入进行修改?通过一些表单来传递参数可能太复杂,太繁琐了。
a_fan_ti

发表文章: 3
注册时间: 2003年06月18日 12:38
Re: Jive中的设计模式问题 发表: 2003年06月27日 12:06 回复
工厂方法主要是为了创建对象而不是保存对象,一系列的B对象的存储不一定要放在工厂内,但是这些对象的创建可以通过工厂。

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

发表文章: 8929
注册时间: 2002年08月03日 17:08
Re: Jive中的设计模式问题 发表: 2003年06月28日 20:47 回复
关于“程序员可能经常忘了调用该方法。”,可以使用接口封装方法,把save放在接口中,如果想做得更绝一点,将A类的获得等操作封装在工厂模式中,哈哈,再笨的程序员也应该知道了。

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

发表文章: 63
注册时间: 2002年09月02日 20:33
Re: Jive中的设计模式问题 发表: 2003年06月29日 10:24 回复
我认为,jive的持续化层很滥的,别再去学了~~.自己想办法加入个持续化层才是正道.
shyguy

发表文章: 63
注册时间: 2002年09月02日 20:33
Re: Jive中的设计模式问题 发表: 2003年06月29日 10:26 回复
呵呵,再补充一点,不管什么持续化层,代码都是很sb的.只是在模块层次上比原来的要清晰点而已.
onlylx

发表文章: 7
注册时间: 2003年06月26日 22:09
Re: Jive中的设计模式问题 发表: 2003年06月29日 20:05 回复
"可以使用接口封装方法,把save放在接口中,如果想做得更绝一点,将A类的获得等操作封装在工厂模式中"
这句话我不太明白,能不能详细的解释一下?多谢!
xmlone

发表文章: 3
注册时间: 2003年06月30日 08:23
Re: Jive中的设计模式问题 发表: 2003年06月30日 08:24 回复
采用value object的设计模式,不提供对单个属性的set方法,只提供setXXXVO(VO)的方法就行了
banq

发表文章: 8929
注册时间: 2002年08月03日 17:08
Re: Jive中的设计模式问题 发表: 2003年06月30日 11:29 回复
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方法。


onlylx

发表文章: 7
注册时间: 2003年06月26日 22:09
Re: Jive中的设计模式问题 发表: 2003年06月30日 21:54 回复
多谢banq
Njord

发表文章: 21
注册时间: 2002年12月05日 23:23
Re: Jive中的设计模式问题 发表: 2003年07月04日 16:57 回复
对于每个set都调用saveToDB方法的设计我觉得比较符合实际的使用情况,因为用户的修改动作一般都是针对少数的几个属性,大多数的时候是针对一个属性进行修改。
qys

发表文章: 1
注册时间: 2003年07月11日 03:43
Re: Jive中的设计模式问题 发表: 2003年07月11日 03:45 回复
really good!
tomfan

发表文章: 22
注册时间: 2003年07月11日 18:27
Re: Jive中的设计模式问题 发表: 2003年07月15日 08:51 回复
请问Value Object变种:是什么意思?
这个主题有 11 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-07 jdon.com

anti spam