文章目录
题目
(自定义异常)完成某个计费系统的用户登录和注册模块,要求如下: 1) 创建一个 User 类,包括:用户登录名(username)、密码(password)、用户真实姓名(name)、电子邮件地址(email)属性和相应的构造方法及 set/get 方法。
2) 创建两个自定义异常类,一个 LoginException,表示登录异常。一个 RegisterException, 表示注册异常。自定义的两个异常,都要求有一个接受字符串类型参数的构造方法。
3) 创建一个 UserBiz 接口,该接口中定义两个方法:
void register(String username, String password, String password2, String name, String email) throws RegisterException //用户注册 void login(String username, String password) throws LoginException //用户登录
其中 register 方法接受两个 password 参数,原因是:在用户注册时,需要输入两遍 password,只有两次输入的 password 一致,才允许注册。
4) 创建 UserBiz 接口的实现类。其中
为该实现类创建一个属性,该属性为一个 Map,用来保存已注册的用户信息。 Map 的键为用户登录名,值为登录名对应的 User 对象。初始情况下,Map 中保存的对象为以下两个:
register 方法在以下两种情况下抛出异常:
1) username 在 Map 中已存在
2) 两次输入的 password 不一致
login 方法在以下两种情况下抛出异常:
1) username 不存在
2) username 和 password 不匹配
5) 创建一个 UserView 接口,该接口中定义两个方法: void login();
void register();
6) 创建 UserView 接口的实现类。
该实现类的 login 方法中,利用命令行,让用户输入用户名和密码,之后调用
UserBiz 中的 login 方法。部分代码如下:
void login(){
System.out.println(“请输入用户名:”); String username = /读入用户名…/; System.out.println(“请输入密码”); String password = /读入密码/;
//调用 UserBiz 中的 login 方法
}
该类的 register 方法采用类似的方法,让用户输入注册时需要的信息,然后调用
UserBiz 中的 register 方法。 注意:
1、 密码应该让用户输入两遍。
2、 UserViewImpl 中应当有一个 UserBiz 类型的属性 7) 编写测试代码。 类图如下:
分析
HashMap底层原理:数组加链表
User类
/**
* 用户类(-表示private)
* -username:String 用户登录名
* -password:String 密码
* -name:String 用户真实姓名
* -email:String 电子邮件地址
*/
public class User {
//用户登录名 密码 用户真实姓名 电子邮件地址
private String username;
private String password;
private String name;
private String email;
//无参构造
public User() {
}
//有参构造
public User(String username, String password, String name, String email) {
this.username = username;
this.password = password;
this.name = name;
this.email = email;
}
//Getter&Setter
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//重写toString方法
@Override
public String toString() {
return "用户{" +
"用户名='" + username + '\'' +
", 真实姓名='" + name + '\'' +
", 电子邮箱='" + email + '\'' +
'}';
}
}
RegisterException类
/**
* 注册异常
*/
public class RegisterException extends Exception{
//无参构造
public RegisterException() {
}
//有参构造
public RegisterException(String message) {
super(message);
}
}
LoginException类
/**
* 登录异常
*/
public class LoginException extends Exception{
//无参构造
public LoginException() {
}
//有参构造
public LoginException(String message) {
super(message);
}
}
UserBiz接口
/**
* 用户服务接口(+表示public)
* +login(String username, String password):void
* +register(String username,String password,String password2,String name,String email):void
*/
public interface UserBiz {
//注册方法
void register(String username,String password,String password2,String name,String email)throws RegisterException;
//登录方法
void login(String username, String password)throws LoginException;
}
UserBizImpl类
import java.util.HashMap;
import java.util.Map;
/**
* 用户服务实现类
* -userMap:Map 用来保存已注册的用户信息
* Map 的键为用户登录名,值为登录名对应的User对象。
*/
public class UserBizImpl implements UserBiz{
private Map<String,User> userMap;
//无参构造
public UserBizImpl() {
userMap = new HashMap<>();
userMap.put("admin",new User("admin","admin","Administrator","admin@123.com"));
userMap.put("Tom",new User("Tom","cat","tomcat","tomcat@cat.com"));
}
//注册方法
@Override
public void register(String username, String password, String password2, String name, String email) throws RegisterException {
//根据username获取Map中的user对象
User user = userMap.get(username);
//username在Map中已存在
if(user != null){
throw new RegisterException(username+"在Map中已存在");
//两次password不一致
}else if ( ! password.equals(password2)) {
throw new RegisterException("两次输入的密码不一致");
}else {
userMap.put("username",new User(username,password,name,email));
}
}
//登录方法
@Override
public void login(String username, String password) throws LoginException {
//根据username获取Map中的user对象
User user = userMap.get(username);
//user不存在
if(user ==null){
throw new LoginException(username+"不存在");
//username 和 password 不匹配
}
if(!user.getPassword().equals(password)){
throw new LoginException("用户名"+username+"和密码"+password+"不匹配" );
}
System.out.println("登陆成功");
}
//查看方法
public void see(){
//values是按哈希码排布,在外看来是乱序。
System.out.println(userMap.values());
}
}
UserView接口
/**
* 用户界面
*/
public interface UserView {
void register() ;
void login() ;
}
UserViewImpl类
import java.util.Scanner;
/**
* 用户界面实现类
*/
public class UserViewImpl implements UserView {
UserBiz userBiz;
Scanner sc;
//注册
@Override
public void register() {
//Scanner类
sc = new Scanner(System.in);
System.out.println("请输入用户名:");
//读入用户名
String username = sc.next();
//读入密码
System.out.println("请输入密码");
String password = sc.next();
//读入第二次密码
System.out.println("请输入第二次密码");
String password2 = sc.next();
//读入用户真实姓名
System.out.println("请输入真实姓名");
String name = sc.next();
//读入用户邮箱
System.out.println("请输入真实姓名");
String email = sc.next();
//创建UserBizImpl对象
userBiz = new UserBizImpl();
try {
userBiz.register(username,password,password2,name,email);
} catch (RegisterException e) {
e.printStackTrace();
}
}
//登录
@Override
public void login() {
//Scanner类
sc = new Scanner(System.in);
System.out.println("请输入用户名:");
//读入用户名
String username = sc.next();
//读入密码
System.out.println("请输入密码");
String password = sc.next();
//创建UserBizImpl对象
userBiz = new UserBizImpl();
try {
userBiz.login(username,password);
} catch (LoginException e) {
e.printStackTrace();
}
}
}
Test测试类
import java.util.Scanner;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
//用户服务的对象
UserBizImpl userBiz = new UserBizImpl();
//用户界面的对象
UserViewImpl userView = new UserViewImpl();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("--------------------------------------------------");
System.out.println("请选择功能:");
System.out.println("1:用户注册");
System.out.println("2:用户登录");
System.out.println("3:查看已注册的所有用户");
System.out.println("0:退出程序");
int choose =sc.nextInt();
switch (choose) {
case 1:
userView.register();
break;
case 2:
userView.login();
break;
case 3:
userBiz.see();
break;
case 0:
System.exit(0);
break;
default:
System.out.println("你输入的数字不正确,请重试");
}
}
}
}