用户登录注册案例(集合版)分析:
需求:用户登录注册案例(集合版)。 按照如下的操作,可以让我们更符合面向对象思想 A:有哪些类呢? B:每个类有哪些东西呢? C:类与类之间的关系是什么呢? 分析: A:有哪些类呢? 用户类 测试类 B:每个类有哪些东西呢? 用户类: 成员变量:用户名,密码 构造方法:无参构造 成员方法:getXxx()/setXxx() 登录 注册 假如用户类的内容比较多,将来维护起来就比较麻烦,为了更清晰的分类,我们就把用户又划分成了两类 用户基本描述类 成员变量:用户名,密码 构造方法:无参构造 成员方法:getXxx()/setXxx() 用户操作类 登录 注册 测试类: main方法。 C:类与类之间的关系是什么呢? 在测试类中创建用户操作类和用户基本描述类的对象,并使用其功能。 分包: A:功能划分 B:模块划分 C:先按模块划分,再按功能划分 今天我们选择按照功能划分: 用户基本描述类包 cn.itcast.pojo 用户操作接口 cn.itcast.dao 用户操作类包 cn.itcast.dao.impl 今天是集合实现,过几天是IO实现,再过几天是GUI实现,就业班我们就是数据库实现 用户测试类 cn.itcast.test
用户登录注册案例分析图解:
示例代码如下:
这是用户基本描述类
1 package cn.itcast.pojo; 2 3 /** 4 * 这是用户基本描述类 5 * 6 * @author 风清扬 7 * @version V1.0 8 * 9 */ 10 public class User { 11 // 用户名 12 private String username; 13 // 密码 14 private String password; 15 16 public User() { 17 } 18 19 public String getUsername() { 20 return username; 21 } 22 23 public void setUsername(String username) { 24 this.username = username; 25 } 26 27 public String getPassword() { 28 return password; 29 } 30 31 public void setPassword(String password) { 32 this.password = password; 33 } 34 }
这是针对用户进行操作的接口
1 package cn.itcast.dao; 2 3 import cn.itcast.pojo.User; 4 5 /** 6 * 这是针对用户进行操作的接口 7 * 8 * @author 风清扬 9 * @version V1.0 10 * 11 */ 12 public interface UserDao { 13 /** 14 * 这是用户登录功能 15 * 16 * @param username 17 * 用户名 18 * @param password 19 * 密码 20 * @return 返回登录是否成功 21 */ 22 public abstract boolean isLogin(String username, String password); 23 24 /** 25 * 这是用户注册功能 26 * 27 * @param user 28 * 要注册的用户信息 29 */ 30 public abstract void regist(User user); 31 }
这是用户操作的具体实现类(集合版)
1 package cn.itcast.dao.impl; 2 3 import java.util.ArrayList; 4 5 import cn.itcast.dao.UserDao; 6 import cn.itcast.pojo.User; 7 8 /** 9 * 这是用户操作的具体实现类(集合版) 10 * 11 * @author 风清扬 12 * @version V1.0 13 * 14 */ 15 public class UserDaoImpl implements UserDao { 16 // 为了让多个方法能够使用同一个集合,就把集合定义为成员变量 17 // 为了不让外人看到,用private修饰 18 // 普通的成员变量是每个对象所特有的 19 // private ArrayList<User> array = new ArrayList<User>(); 20 // 为了让多个对象共享同一个成员变量,用static修饰 21 // 即静态的成员变量是每个对象都可以使用的 22 private static ArrayList<User> array = new ArrayList<User>(); 23 24 @Override 25 public boolean isLogin(String username, String password) { 26 // 遍历集合,获取每一个用户,并判断该用户的用户名和密码是否和传递过来的匹配 27 boolean flag = false; 28 29 for (User u : array) { 30 if (u.getUsername().equals(username) && u.getPassword().equals(password)) { 31 flag = true; 32 break; 33 } 34 } 35 36 return flag; 37 } 38 39 @Override 40 public void regist(User user) { 41 // 把用户信息存储到集合 42 // ArrayList<User> array = new ArrayList<User>(); 43 array.add(user); 44 } 45 }
这是用户测试类
1 package cn.itcast.test; 2 3 import java.util.Scanner; 4 5 import cn.itcast.dao.UserDao; 6 import cn.itcast.dao.impl.UserDaoImpl; 7 import cn.itcast.game.GuessNumber; 8 import cn.itcast.pojo.User; 9 10 /** 11 * 这是用户测试类 12 * 13 * @author 风清扬 14 * @version V1.0 15 * 16 * 新增加了两个小问题 17 * A:多个对象共享同一个成员变量时,该成员变量用静态修饰 18 * B:循环里面如果有switch,并且在switch里面有break,那么结束的不是循环,而是switch语句 19 * 20 */ 21 public class UserTest { 22 public static void main(String[] args) { 23 // 为了能够回来 24 while (true) { 25 // 欢迎界面,给出选择项 26 System.out.println("--------------欢迎光临--------------"); 27 System.out.println("1 登录"); 28 System.out.println("2 注册"); 29 System.out.println("3 退出"); 30 System.out.println("请输入你的选择:"); 31 32 // 键盘录入选择,根据选择做不同的操作 33 Scanner sc = new Scanner(System.in); 34 // 为了后面的录入信息的方便,我所有的数据录入全部用字符串进行接收 35 String choiceString = sc.nextLine(); 36 37 // switch语句的多个地方要使用它,我就定义到外面 38 UserDao ud = new UserDaoImpl(); 39 40 // 经过简单的思考,我选择了switch,必须是JDK7以后,因为switch的表达式是字符串(JDK7的新特性) 41 switch (choiceString) { 42 case "1": 43 // 登录界面,请输入用户名和密码 44 System.out.println("--------------登录界面--------------"); 45 System.out.println("请输入用户名:"); 46 String username = sc.nextLine(); 47 System.out.println("请输入密码:"); 48 String password = sc.nextLine(); 49 50 // 调用登录功能 51 // UserDao ud = new UserDaomImpl(); 52 53 boolean flag = ud.isLogin(username, password); 54 if (flag) { 55 System.out.println("登录成功,可以开始玩游戏了"); 56 57 System.out.println("你玩吗?y/n"); 58 while (true) { 59 String resultString = sc.nextLine(); 60 if (resultString.equalsIgnoreCase("y")) { 61 // 玩游戏 62 GuessNumber.start(); 63 System.out.println("你还玩吗?y/n"); 64 } else { 65 break; 66 } 67 } 68 69 System.out.println("谢谢使用,欢迎下次再来"); 70 71 System.exit(0); 72 // break; // 这里的break,结束的是switch,而while循环没有结束 73 } else { 74 System.out.println("用户名或者密码有误,登录失败"); 75 } 76 break; 77 case "2": 78 // 注册界面,请输入用户名和密码 79 System.out.println("--------------注册界面--------------"); 80 System.out.println("请输入用户名:"); 81 String newUsername = sc.nextLine(); 82 System.out.println("请输入密码:"); 83 String newPassword = sc.nextLine(); 84 85 // 调用注册功能 86 // 多态用法 87 // UserDao ud = new UserDaoImpl(); 88 // 具体类用法 89 // UserDaoImpl udi = new UserDaoImpl(); 90 91 // 把用户名和密码封装到一个对象中 92 User user = new User(); 93 user.setUsername(newUsername); 94 user.setPassword(newPassword); 95 96 ud.regist(user); // 肯定注册成功,因为该方法的底层调用的是ArrayList的add()方法,该方法总是返回true。 97 System.out.println("注册成功"); 98 break; 99 case "3": 100 default: 101 System.out.println("谢谢使用,欢迎下次再来"); 102 System.exit(0); // 强制退出 103 break; 104 } 105 } 106 } 107 }
这是猜数字小游戏
1 package cn.itcast.game; 2 3 import java.util.Scanner; 4 5 /** 6 * 这是猜数字小游戏 7 * 8 * @author 风清扬 9 * @version V1.0 10 * 11 */ 12 public class GuessNumber { 13 private GuessNumber() { 14 } 15 16 public static void start() { 17 // 产生一个随机数 18 int number = (int) (Math.random() * 100) + 1; 19 20 // 定义一个统计变量 21 int count = 0; 22 23 while (true) { 24 // 键盘录入一个数据 25 Scanner sc = new Scanner(System.in); 26 System.out.println("请输入数据[1-100]:"); 27 int guessNumber = sc.nextInt(); 28 29 count++; 30 31 // 判断 32 if (guessNumber > number) { 33 System.out.println("你猜的数据" + guessNumber + "大了"); 34 } else if (guessNumber < number) { 35 System.out.println("你猜的数据" + guessNumber + "小了"); 36 } else { 37 System.out.println("恭喜你," + count + "次就猜中了"); 38 break; 39 } 40 } 41 } 42 }