|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-02-27
我在做系统设计时遇到一个问题,向大家请教一下。
代码没有编译过,可能有语法错误 ,望见谅 场景:用户可以到系统填写一些申请单,现有一个需求,一般用户只能查询他自己填写的申请单,管理员可以查询所有的申请单 我不想用if...else...之类的语句来区分,不知我下面的做法是否可行,还是有更好的方案,望不吝赐教 public enum Role
{
Admin = 1,
GeneralUser = 2
}
public interface IApplyManager
{
List GetApplies(User user);
//...Other methods
}
public class ApplyManagerImpl implements IApplyManager
{
//这一段只是模拟,到时候会用配置文件来实例化Dao
private static HashTable ht = new HashTable();
public ApplyManagerImpl()
{
IApplyDao dao4Admin = new ApplyDao4Admin();
IApplyDao dao4User = new ApplyDao4User();
ht.add(Role.Admin, dao4Admin);
ht.add(Role.User, dao4User);
}
public List GetApplies(User user)
{
IApplyDao dao = (IApplyDao)ht[user.Role];
return dao.LoadApplies(user);
}
}
public interface IApplyDao
{
//...Save, Update, Delete etc.
List LoadApplies(User user);
}
public class ApplyDao4Admin implements IApplyDao
{
//...Save, Update, Delete etc.
//参数user在这里没有用处
List LoadApplies(User user)
{
//查询数据库,获得所有申请记录
}
}
public class ApplyDao4User implements IApplyDao
{
//...Save, Update, Delete etc.
//查询该用户的所有申请
List LoadApplies(User user)
{
//查询数据库
}
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-27
用aop,couzi
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-27
对不起,我没有把话说清楚
我的意思是dao这样分成两个类来写是否合适? 因为以前没有这样做过。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-27
现在的问题就是管理员与一般用户检索用的SQL是不一样的,相差还不是一点半点
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-27
个人认为如果业务比较简单可以这样写,毕竟Role的类型不会太多,也避免了配置的麻烦
以后有必要再重构吧 |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-28
diablo.zhang 写道 现在的问题就是管理员与一般用户检索用的SQL是不一样的,相差还不是一点半点
既然相差较大,就不要用一个dao接口。 # public interface IApplyDao # # { # # //...Save, Update, Delete etc. # # List LoadApplies(User user); # # # # } 比如管理员要load管理员数据,用户要load用户数据,你一定要定义一个abstract 的名字叫 loaddata. 这样只会是系统复杂而没有好处的。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-28
ardenliu 写道 diablo.zhang 写道 现在的问题就是管理员与一般用户检索用的SQL是不一样的,相差还不是一点半点
既然相差较大,就不要用一个dao接口。 # public interface IApplyDao # # { # # //...Save, Update, Delete etc. # # List LoadApplies(User user); # # # # } 比如管理员要load管理员数据,用户要load用户数据,你一定要定义一个abstract 的名字叫 loaddata. 这样只会是系统复杂而没有好处的。 可能你误解 我的意思是查询出来的都是Apply列表,只是管理员可以看全部的,一般用户只能看自己的 也就是说,只是where后面的SQL不一样,但最难复杂的也是where后的SQL |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-28
强烈建议还是用SQL。where语句即使复杂,应该也能写出来吧。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-28
如果仅仅是where后面的查询条件不同的话,楼主可以从你现有的代码着手,采用类似于你现在的思想在ht[user.Role]的时候返回的是你的where语句(或者where中有差别的地方)。这样可以减少创建类的数量。这样的话扩展起来也相对容易一些。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-28
香克斯 写道 如果仅仅是where后面的查询条件不同的话,楼主可以从你现有的代码着手,采用类似于你现在的思想在ht[user.Role]的时候返回的是你的where语句(或者where中有差别的地方)。这样可以减少创建类的数量。这样的话扩展起来也相对容易一些。 我曾經想過用香克斯的方法,但有一點問題 因為Admin的SQL是不需要傳入任何參數,而User的SQL要傳入UserID或Name作為參數,這樣還是要用if...else...來判斷是否需要創建參數對象呀。 |
|
| 返回顶楼 | |






