1. 登录注册案例分析图解:

2. 用户登录案例 详细分析 和 分包实现:

(1)用户登录案例详细分析(面向对象思想)

按照如下的操作,可以让我们更符合面向对象思想:

  • 有哪些类呢?

                用户类

                测试类

      • 每个类有哪些东西呢?

                用户类:

       成员变量:用户名,密码

                        构造方法:无参构造

                        成员方法:getXxx() / setXxx()

                                          登录,注册

                       假如用户类的内容比较多,将来维护起来就比较麻烦,为了更清晰的分类,我们就把用户又划分成了两类:

                      用户基本描述类:                           

                            成员变量:用户名,密码

                                               构造方法:无参构造

                                               成员方法:getXxx() / setXxx()

                       用户操作类:

                             登录,注册

                                              

              测试类:

                         main方法

      • 类与类之间的关系是什么呢?

     在测试类中创建用户操作类和用户基本描述类的对象,并使用其功能。

(2)用户登录案例分包

 • 功能划分

   • 模块划分

   • 先按模块划分,再按照功能划分

这次我们选择按照功能划分:
  用户基本描述类包:     cn.itcast.pojo
  用户操作接口:           cn.itcast.dao
  用户操作类包:             cn.itcast.dao.impl
这次是集合实现,其次是IO实现,再次是GUI实现,最终就是数据库实现
      用户测试类:              cn.itcast.test

3. 用户登录案例 用户基本描述类 和 用户操作接口 实现:

(1)用户基本描述类:User

 package cn.itcast.pojo;

 /**
*
* 这是用户基本描述类
* @author Mr He
* @version V1.0
*
*/ public class User {
//用户名
private String username;
//密码
private String password; public User() {
super();
} 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;
} }

(2)用户操作接口 :UserDao

 package cn.itcast.dao;

 import cn.itcast.pojo.User;

 /**
* 这是针对用户进行操作的接口
* @author Mr He
* @version V1.0
*
*/
public interface UserDao {
/**
* 这是用户的登录功能
* @param username
* 用户名
* @param password
* 密码
* @return 返回登录是否成功
*/
public abstract boolean isLogin(String username, String password); /**
* 这是用户的注册功能
* @param user 要注册的用户的信息
*/
public abstract void regist(User user);
}

4. 用户登录案例 用户操作类的具体实现:UserDaoImpl

 package cn.itcast.dao.impl;

 import java.util.ArrayList;

 import cn.itcast.dao.UserDao;
import cn.itcast.pojo.User; /**
* 这是用户操作的具体实现类(集合版)
* @author Mr He
* @version V1.0
*
*/ public class UserDaoImpl implements UserDao {
//为了让多个方法能够使用同一个集合,就把集合定义为成员变量
//为了不让外人看的,用private
//为了让多个对象共享同一个成员变量,使用static修饰
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); } }

5. 用户登录案例 猜数字游戏类:GuessNumber

 package cn.itcast.game;

 import java.util.Scanner;

 /**
* 这是猜数字小游戏
* @author Mr He
* @version V1.0
*
*/
public class GuessNumber {
private GuessNumber() {
} public static void start() {
//产生一个随机数
int number = (int) (Math.random()*100)+1; //定义一个统计变量
int count =0;
while (true) {
// 键盘录入一个数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数据(1~100):");
int guessNumber = sc.nextInt();
count++;
// 判断
if (guessNumber > number) {
System.out.println("你猜的数据" + guessNumber + "大了");
} else if (guessNumber < number) {
System.out.println("你猜的数据" + guessNumber + "小了");
} else {
System.out.println("恭喜你,"+count+"次就猜中了");
break;
}
}
}
}

6. 用户登录案例 测试类的实现:UserTest

 package cn.itcast.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; /**
* 用户测试类
*
* @author Mr He
* @version V1.0
*
* 新增加两个小问题:
* (1)多个对象共享同一个成员变量,用静态
* (2)循环里面如果有switch,并且在switch里面有break,那么结束的不是循环,而是switch语句
*/
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 退出");
System.out.println("请输入你的选择:");
// 键盘录入选择,根据选择做不同的操作
Scanner sc = new Scanner(System.in);
// 为了后面的录入值的方便,我所有的数据录入全部用字符接收
String choiceString = sc.nextLine(); // switch多个地方要使用,我就定义到外面
UserDao ud = new UserDaoImpl(); // 经过简单的思考,我选择了switch
switch (choiceString) {
case "1":
// 登录界面,请输入用户名和密码
System.out.println("--------------登录界面--------------");
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine(); // 调用登录功能
// 多态
// UserDao ud = new UserDaoImpl();
boolean flag = ud.isLogin(username, password);
if (flag) {
System.out.println("登录成功,可以开始玩游戏"); System.out.println("你玩吗?y/n");
while (true) {
String resultString = sc.nextLine();
if (resultString.equalsIgnoreCase("y")) {
// 玩游戏
GuessNumber.start();
System.out.println("你还玩吗?y/n");
}else {
break;
}
} System.out.println("谢谢使用,欢迎下次再来");
System.exit(0);
//break;//这里写break,结束的是switch语句
} 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 user = new User();
user.setUsername(newUsername);
user.setPassword(newPassword); // 调用注册功能
// 多态
// UserDao ud = new UserDaoImpl();
// 具体类使用
// UserDaoImpl udi = new UserDaoImpl();
ud.regist(user);
System.out.println("注册成功");
break; case "3":
default:
System.out.println("谢谢使用,欢迎下次再来");
System.exit(0);
break; } }
} }

7. 工程一栏图,如下:

8. 运行效果如下:

(1)测试运行效果1:

--------------欢迎光临--------------
1 登录
2 注册
3 退出
请输入你的选择:
2
--------------注册界面--------------
请输入用户名:
admin
请输入密码:
admin
注册成功
--------------欢迎光临--------------
1 登录
2 注册
3 退出
请输入你的选择:
1
--------------登录界面--------------
请输入用户名:
admin
请输入密码:
admin
登录成功,可以开始玩游戏
你玩吗?y/n
y
请输入一个数据(1~100):
56
你猜的数据56小了
请输入一个数据(1~100):
67
你猜的数据67小了
请输入一个数据(1~100):
78
你猜的数据78小了
请输入一个数据(1~100):
89
你猜的数据89大了
请输入一个数据(1~100):
80
你猜的数据80小了
请输入一个数据(1~100):
84
你猜的数据84小了
请输入一个数据(1~100):
85
恭喜你,7次就猜中了
你还玩吗?y/n
n
谢谢使用,欢迎下次再来

(2)测试运行效果2:

--------------欢迎光临--------------
1 登录
2 注册
3 退出
请输入你的选择:
2
--------------注册界面--------------
请输入用户名:
admin
请输入密码:
admin
注册成功
--------------欢迎光临--------------
1 登录
2 注册
3 退出
请输入你的选择:
1
--------------登录界面--------------
请输入用户名:
admin
请输入密码:
addd
用户名或者密码有误,登录失败
--------------欢迎光临--------------
1 登录
2 注册
3 退出
请输入你的选择:
1
--------------登录界面--------------
请输入用户名:
admin
请输入密码:
admin
登录成功,可以开始玩游戏
你玩吗?y/n
n
谢谢使用,欢迎下次再来

Java基础知识强化之集合框架笔记37:用户登录注册案例的更多相关文章

  1. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  2. Java基础知识强化之集合框架笔记39:Set集合之HashSet存储字符串并遍历

    1. HashSet类的概述: (1)不保证set的迭代顺序 (2)特别是它不保证该顺序恒久不变 HashSet底层数据结构是哈希表,哈希表依赖于哈希值存储,通过哈希值来确定元素的位置,  而保证元素 ...

  3. Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素

    1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5 ...

  4. Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历

    1. Collection的迭代器: Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util ...

  5. Java基础知识强化之集合框架笔记05:Collection集合的遍历

    1.Collection集合的遍历 Collection集合直接是不能遍历的,所以我们要间接方式才能遍历,我们知道数组Array方便实现变量,我们可以这样: 使用Object[]  toArray() ...

  6. Java基础知识强化之集合框架笔记65:Map集合之集合多层嵌套的数据分析

    1. 为了更符合要求: 这次的数据就看成是学生对象. 传智播客 bj 北京校区 jc  基础班 林青霞 27     风清扬 30      jy  就业班   赵雅芝 28  武鑫 29 sh 上海 ...

  7. Java基础知识强化之集合框架笔记62:Map集合之HashMap嵌套HashMap

    1. HashMap嵌套HashMap  传智播客          jc    基础班                      陈玉楼  20                      高跃   ...

  8. Java基础知识强化之集合框架笔记04:Collection集合的基本功能测试

    1. Collection集合的基本功能测试: package cn.itcast_01; import java.util.ArrayList; import java.util.Collectio ...

  9. Java基础知识强化之集合框架笔记01:集合的由来与数组的区别

    1. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储.而要想存储多个对象,就不能是一个基本的变量,而应该 ...

随机推荐

  1. code jam训练

    https://code.google.com/codejam/contests.html http://student.csdn.net/mcs/programming_challenges

  2. Ecshop wap

    http://www.08kan.com/gwk/MzA3MDMxMzAxMw/200091492/1/c38b5937e4e819d9908fe3ae964e3dfc.html

  3. python手记(32)

    #!/usr/bin/env python #-*- coding: utf-8 -*- import cv2 import numpy as np fn="test2.jpg" ...

  4. 译文:TransactionScope 与 Async/Await

    你可能不知道这一点,在 .NET Framework 4.5.0  版本中包含有一个关于 System.Transactions.TransactionScope 在与 async/await 一起工 ...

  5. [LeetCode#260]Single Number III

    Problem: Given an array of numbers nums, in which exactly two elements appear only once and all the ...

  6. bzoj1211

    prufer码水题(n-2)!/[(d1-1)!*(d2-1)!*…*(dn-1)!] ..] of longint; x,n,i,j,s:longint; ans:int64; begin read ...

  7. Node.js权威指南 (2) - Node.js中的交互式运行环境——REPL

    2.1 REPL运行环境概述 / 102.2 在REPL运行环境中操作变量 / 102.3 在REPL运行环境中使用下划线字符 / 122.4 在REPL运行环境中直接运行函数 / 122.5 在RE ...

  8. stringstream 与空格 (大家讨论一下代码结果的原因)

    #include <iostream> // std::cout, std::endl #include <iomanip> // std::setw #include < ...

  9. [回顾]SVE回顾

    SVE回顾 写完后的自评:书写太过凌乱,基本无法阅读. 前几日,SVE通过了TR5,虽说是一个小得不能再小的项目,即使到最后也存在一些未能解决的问题,但在用户的通融下还是在超期一段时间后写下了一个暂时 ...

  10. leetcode 栈 括号匹配

    https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...