一个简单用户系统的设计

来源:互联网 发布:apache 负载均衡 编辑:程序博客网 时间:2024/06/08 18:25
在一个成熟的系统中应该包括以下三个层次:

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)。
原创粉丝点击