一个简单用户系统的设计

在一个成熟的系统中应该包括以下三个层次:

1、用户界面
2、企业逻辑
3、DAO层

另外就是需要一些实体对象用于各个层之间的交互以及数据的存储,这里有些人会把一些专门用于交互传递数据的对象划分成DTO。对于我个人,一个有一种反对使用DTO的观点在里面,这个问题在本篇文章中不做讨论。

在各个开发论坛中会不断地涌现出关于上面我提到的三个层的讨论,而这些讨论也根据面向不同的问题而导致最佳解决方案的偏差。设计就像生活一样,不是永恒不变的,他会根据不同的环境、要解决不同的问题而发生变化。但是也和生活一样,有一定的规律可以寻找。而我个人认为这个规律主要有两方面,1、每个层一定要负责好自己的责任,而不要干涉到其他层的行为和功能。2、各个层之间的关系绝对不是一一对应的,虽然有很多时候是这种情况,但是如果设计的思路局限在这里,会使得代码的重用、可维护性变得很差。这一点我想在用户界面和企业逻辑层之间大多数人都可以很自由的发挥,完全脱离一对一的框架,但是对于企业逻辑层和DAO层,则容易陷入一对一的思维中。而2可以说是对1的一个补充和保证,后面我们将详细解释为什么。根据这个原则,我们需要的就是如何把一个项目中的需求正确或者说合乎情理的划分到各个层当中。用户界面层的主要功能就在于和用户的交互,也就是说接受用户的输入及指令。企业逻辑层,则是将企业的运行规则程序的话的地方,也可以说是一个系统的核心部分,而DAO层则是专心负责与系统数据存储的交互,大部分是和数据库的交互,当然也可能是各种文件或者网络资源。

为了更清楚理解各个层的功能,我用一个常见的用户系统作为例子进行说明,而这个例子也把重点放在企业逻辑层和DAO层。

以下是用户系统的基本要求:
1、用户注册
2、用户登陆
3、修改密码

以下是其企业逻辑层的借口定义:

public interface UserService {
   
    /**
     * @param user
     * @throws UserRegisterException
     */
    public void register(User user) throws UserRegisterException;
   
   
    /**
     * @param userEmail
     * @param password
     * @return
     * @throws IncorrectPasswordException
     */
    public User login(String userEmail, String password) throws LoginException;
   
   
    /**
     * @param userId
     * @param oldPassword
     * @param newPassword
     * @throws IncorrectPasswordException
     * @throws UserNotFoundException
     */
    public void changePasswordword(long userId, String oldPassword, String newPassword) throws IncorrectPasswordException,UserNotFoundException;
}


在这里所有的Exception都是checked Exception,因为我的想法是,在企业逻辑层抛出的异常应该是可以控制的,至少是希望被程序控制的,这样才可以让UI层根据这些异常做出相应处理。

以下是DAO的接口
public interface UserDAO {
    /**
     * @param user
     */
    public void registerUser(User user);
   
    /**
     * @param email
     * @return
     */
    public boolean emailRegistered(String email);
   
    /**
     * @param userId
     * @return
     */
    public boolean userExists(long userId);
   
    /**
     * @param email
     * @return
     */
    public User getUserDetailByEmail(String email);
   
    /**
     * @param userId
     * @return
     */
    public User getUserDetailByuserId(long userId);
   

    /**
     * @param userId
     * @param password
     */
    public void changePassword(long userId,String password);
   
   
}


下面是UserService地实现代码
public class UserServiceImpl implements UserService {
   
    private UserDAO userDAO;

    /* (non-Javadoc)
     * @see com.websolution.user.UserService#register(com.websolution.user.User)
     */
    public void register(User user) throws UserRegisterException {
        if(userDAO.emailRegistered(user.getUserEmail())){
            throw new UserRegisterException("Email have been registed");
        }else{
            userDAO.registerUser(user);
        }
    }


    /* (non-Javadoc)
     * @see com.websolution.user.UserService#login(java.lang.String, java.lang.String)
     */
    public User login(String userEmail, String password)
            throws LoginException {
        User user = userDAO.getUserDetailByEmail(userEmail);
        if(user==null){
            throw new LoginException(LoginException.EMAIL_NOT_EXIST);
        }else{
            if(user.getUserPassword().equals(password)){
                return user;
            }else{
                throw new LoginException(LoginException.PASSWORD_NOT_CORRECT);
            }
        }
    }

    /* (non-Javadoc)
     * @see com.websolution.user.UserService#changePasswordword(long, java.lang.String, java.lang.String)
     */
    public void changePasswordword(long userId, String oldPassword,
            String newPassword) throws IncorrectPasswordException,
            UserNotFoundException {
        User user = userDAO.getUserDetailByuserId(userId);
        if(user==null){
            throw new UserNotFoundException(User.class,Long.toString(userId));
        }else{
            if(user.getUserPassword().equals(oldPassword)){
                userDAO.changePassword(userId,newPassword);
            }else{
                throw new IncorrectPasswordException();
            }
        }
    }

}

从上面的代码中我们可以看到,企业逻辑层和DAO层的API并没有一一对应,而DAO这里没有给出DAO层实现部分的代码的原因在于DAO仅仅作了数据的的读写,并根据数据库返回的结果给出一个适当的返回数据而已。

版权所有:idilent 网站转载请注明作者 其他转载方式请与作者联系( idilent@yahoo.com.cn)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简易的管理信息系统可以包括以下几个模块: 1. 用户管理模块:用于管理系统用户账号和权限,包括用户注册、登录、修改密码等功能。 2. 数据库管理模块:用于管理系统的数据存储和访问,包括数据的增删改查、数据备份和恢复等功能。 3. 数据分析和报表模块:用于对系统中的数据进行分析和汇总,生成各种类型的报表和图表,帮助用户更好地了解数据。 4. 任务管理模块:用于管理用户的任务和工作流程,包括任务的创建、分配、完成情况的跟踪等功能。 5. 消息通知模块:用于发送系统通知和提醒,包括邮件、短信、推送等多种方式,提醒用户关注系统的重要事件和任务。 设计一个简易的管理信息系统,可以采用以下步骤: 1. 确定系统的主要功能和业务需求。 2. 设计系统的数据模型和数据库结构,选择合适的数据库系统和开发工具。 3. 开发系统用户管理模块,包括用户注册、登录、权限管理等功能。 4. 开发系统的数据管理模块,包括数据的增删改查、数据备份和恢复等功能。 5. 开发系统的数据分析和报表模块,包括数据的统计和可视化展示。 6. 开发系统的任务管理模块,包括任务的创建、分配、完成情况的跟踪等功能。 7. 开发系统的消息通知模块,包括邮件、短信、推送等多种方式,提醒用户关注系统的重要事件和任务。 8. 进行系统的测试和集成,并部署到服务器上。 9. 定期维护和更新系统,确保系统能够满足不断变化的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值