学习完集合框架以后做了一个用集合去实现控制台的注册登录的操作,这个案例是用集合去存储用户的注册的信息,所以存在每次运行程序都要进行一个注册的操作,这也是程序目前唯一的一个bug了。但是写完这个例子,还是让我受益颇多的,对于程序中真是的开发如何去进行分析。
首先要对这个案例分析有几个类:
1、实体类
2、用户操作类
3、在实体类与用户操作类之间的dao接口,也就是用户操作接口
4、游戏类,在成功进行登录之后可以玩游戏,这个游戏是一个猜数字游戏,随机生成一个1-100之间的数字,用户输入猜的数字
5、测试类,测试程序能否正常运行的类
其次是分包:
按照实际开发的操作我分了一下几个包:
cn.itheima.pojo.User:实体类
cn.itheima.dao.UserDao:用户操作接口
cn.itheima.dao.impl.UserDaoImpl:用户操作接口实现类
cn.itheima.game.GuessNumber:游戏类
cn.itheima.test.UserTest:测试类
最后代码实现:
从实体类开始,实体类相对比较简单,就是对外提供setXXX和getXXX方法来访问数据
User类:
package cn.itheima.pojo;
public class User {
private String username; //用户名
private String password; //密码
public User(){}
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;
}
}
接口:
package cn.itheima.dao;
import cn.itcast.pojo.User;
public interface UserDao {
/**
* 登录功能
*
* @param username
* 用户名
* @param password
* 密码
* @return
*/
public abstract boolean isLogin(String username, String password);
/**
* 注册功能
* @param user 用户
*/
public abstract void regist(User user);
}
接口实现类:
package cn.itheima.dao.impl;
import java.util.ArrayList;
import cn.itcast.dao.UserDao;
import cn.itcast.pojo.User;
public class UserDaoImpl implements UserDao {
private static ArrayList<User> array = new ArrayList<User>();//定义保存用户的集合对象
public boolean isLogin(String username , String password){
boolean flag = false;
//遍历集合匹配用户名和密码
for(User u : array){
if(u.getUsername().equals(username) && u.getPassword().equals(password)){
flag = true;
break;
}
}
return flag;
}
public void regist(User user){
array.add(user);
}
}
游戏类:
package cn.itheima.game;
import java.util.Scanner;
public class GuessNumber {
public static void start(){
Scanner sc = new Scanner(System.in);
int randomNum = (int)(Math.random()*100+1);
int count = 0;
while(true){
count++;
System.out.println("请输入你猜的数字:");
int num = sc.nextInt();
if(num > randomNum){
System.out.println("您猜的数据大了");
}else if(num < randomNum){
System.out.println("您猜的数据小了");
}else{
System.out.println("恭喜您,"+count+"次就猜中了");
break;
}
}
}
}
最后是测试类
package cn.itheima.test;
import java.util.Scanner;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.game.GuessNumber;
import cn.itcast.pojo.User;
public class UserTest {
public static void main(String[] args) {
while(true){
System.out.println("--------------欢迎光临--------------");
System.out.println("1登录");
System.out.println("2注册");
System.out.println("3退出");
Scanner sc = new Scanner(System.in);
String choiceString = sc.nextLine();
int choiceNum = Integer.valueOf(choiceString);
UserDao ud = new UserDaoImpl();
switch(choiceNum){
case 1 :
System.out.println("--------------登录界面--------------");
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
User user = new User();
user.setUsername(username);
user.setPassword(password);
boolean flag = ud.isLogin(username, password);
if(flag){
System.out.println("登录成功,可以开始玩游戏了");
System.out.println("你要玩游戏吗?y/n");
while(true){
String resultString = sc.nextLine();
if("y".equals(resultString)){
GuessNumber.start();
System.out.println("您还要玩吗?y/n");
}else{
break;
}
}
// break;
System.out.println("谢谢使用,程序已退出");
System.exit(0);
}else{
System.out.println("用户名或密码错误,请重新输入");
}
break;
case 2 :
System.out.println("--------------注册界面--------------");
System.out.println("请输入用户名:");
String newUsername = sc.nextLine();
System.out.println("请输入密码:");
String newPassword = sc.nextLine();
User newUser = new User();
newUser.setUsername(newUsername);
newUser.setPassword(newPassword);
ud.regist(newUser);
break;
case 3 :
default :
System.out.println("谢谢光临,下次再来");
System.exit(0);
break;
}
}
}
}
注意的地方:因为是使用集合去实现数据的存储,所以需要在用户接口实现类中,讲保存用户数据的集合对象加上静态,这是因为在测试类中使用了循环,每次循环都会产生一个新的对象,进而成员变量就无法共享了,为了实现数据的共享,就使用静态修饰集合。
总结:这个例子使用了基本的流程控制语句以及面向对象当中静态关键字的特点,以及集合和泛型的使用,并且实际开发当中需要分包,凡是接口放在dao包下,接口实现类放在dao.impl包下,实现类放在test下,实体类放在pojo下。