论坛首页 Java版 OO

请教一下系统设计的问题

浏览 2409 次
精华帖 (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)

	{

		//查询数据库

	}

}
   
最后更新时间:2008-02-27
用aop,couzi
   
0 请登录后投票
最后更新时间:2008-02-27
对不起,我没有把话说清楚
我的意思是dao这样分成两个类来写是否合适?
因为以前没有这样做过。
   
0 请登录后投票
最后更新时间:2008-02-27
现在的问题就是管理员与一般用户检索用的SQL是不一样的,相差还不是一点半点
   
0 请登录后投票
最后更新时间:2008-02-27
个人认为如果业务比较简单可以这样写,毕竟Role的类型不会太多,也避免了配置的麻烦
以后有必要再重构吧
   
0 请登录后投票
最后更新时间:2008-02-28
diablo.zhang 写道
现在的问题就是管理员与一般用户检索用的SQL是不一样的,相差还不是一点半点


既然相差较大,就不要用一个dao接口。
# public interface IApplyDao 
#  
# { 
#  
#     //...Save, Update, Delete etc. 
#  
#     List LoadApplies(User user); 
#  
#      
#  
# } 

比如管理员要load管理员数据,用户要load用户数据,你一定要定义一个abstract 的名字叫 loaddata.
这样只会是系统复杂而没有好处的。
   
0 请登录后投票
最后更新时间: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
   
0 请登录后投票
最后更新时间:2008-02-28
强烈建议还是用SQL。where语句即使复杂,应该也能写出来吧。
   
0 请登录后投票
最后更新时间:2008-02-28
如果仅仅是where后面的查询条件不同的话,楼主可以从你现有的代码着手,采用类似于你现在的思想在ht[user.Role]的时候返回的是你的where语句(或者where中有差别的地方)。这样可以减少创建类的数量。这样的话扩展起来也相对容易一些。
   
0 请登录后投票
最后更新时间:2008-02-28
香克斯 写道
如果仅仅是where后面的查询条件不同的话,楼主可以从你现有的代码着手,采用类似于你现在的思想在ht[user.Role]的时候返回的是你的where语句(或者where中有差别的地方)。这样可以减少创建类的数量。这样的话扩展起来也相对容易一些。

我曾經想過用香克斯的方法,但有一點問題
因為Admin的SQL是不需要傳入任何參數,而User的SQL要傳入UserID或Name作為參數,這樣還是要用if...else...來判斷是否需要創建參數對象呀。
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐