Java设计模式之外观模式示例详解
326
2022-08-02
案例分析:
我们之前做过的登录注册案例是把用户信息存进集合里,要用IO流实现的话,就是要把用户信息存入文件中。登录注册两个功能的具体实现是在用户操作类中,所以我们只需要在用户操作类中把之前用户信息存进集合改为存进文件就可以了。
用到的类的详细分解:
(1)用户类(User):用户名,密码,邮箱,电话号码等等各种注册时会用到的东西。我们在实现这个登录和注册案例的时候只需要用户名和密码就够了。这是一个标准java描述类。
package com.edu.domain;
public class User {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWoed(String passWord) {
this.passWord = passWord;
}
public User(String userName, String passWord) {
super();
this.userName = userName;
this.passWord = passWord;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
}
(2)我们需要定义一个接口(UserDao)来定义注册和登录功能。接口就是对类的功能的一种扩展,它的本质是用来定义规则的。
package com.edu.dao;
import java.io.IOException;
import com.edu.domain.User;
public interface UserDao {
//定义两个功能
//注册功能
public abstract void regist(User user) throws IOException;
//登录功能
public abstract boolean isLogin(String userName,String passWord);
}
(3)用户操作类(UserDaoImpl),也就是之前定义的接口UserDao的实现类。
package com.edu.dao.impl;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import com.edu.dao.UserDao;
import com.edu.domain.User;
public class UserDaoImpl implements UserDao{
public static File file = new File("user.txt");
//静态代码块,随着类的加载而加载
static{
try{
file.createNewFile();
}catch(IOException e){
e.printStackTrace();
}
}
//注册功能
@Override
public void regist(User user) throws IOException {
try{
//把用户信息存进文件里
String info=user.getUserName()+"="+user.getPassWord();
//创建高效字符输出流来给文件写入数据,创建了一个可以追加写入的FileWriter,避免了文件中之前的用户信息被覆盖
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true));
bw.write(info);
bw.newLine();
bw.flush();
bw.close();
}catch(IOException e){
e.printStackTrace();
}
}
//登录功能
@Override
public boolean isLogin(String userName, String passWord) {
boolean flag=false;
try{
//创建高效字符输入流来读取数据
BufferedReader br = new BufferedReader(new FileReader("user.txt"));
String line;
while ((line=br.readLine())!=null) {
String[] s=line.IvbqfSWsplit("=");
if (s[0].equals(userName)&&s[1].equals(passWord)) {
flag=true;
}
}
}catch(IOException e){
e.printStackTrace();
}
return flag;
}
}
(4)在用户完成注册登录后,我们可以实现某种功能了,例如:猜数字小游戏。再建一个游戏类(GuessNumber)。
package com.edu.game;
import java.util.Scanner;
public class GuessNumber {
public static void playGame(){
//获取一个1到100的随机数
int random = (int)(Math.random()*100+1);
//键盘录入
Scanner sc = new Scanner(System.in);
//给出提示
System.out.println("请输入所猜的数字");
int number = sc.nextInt();
while(true){
if(number==random){
System.out.println("恭喜你猜对了!");
break;
}else if(number>random){
System.out.println("大了,请继续输入:");IvbqfSW
number=sc.nextInt();
}else if(number
System.out.println("小了,请继续输入:");
number=sc.nextInt();
}
}
}
}
(5)测试类(Test)。
package com.edu.test;
import java.io.IOException;
import java.util.Scanner;
import com.edu.dao.impl.UserDaoImpl;
import com.edu.domain.User;
import com.edu.game.GuessNumber;
public class Test {
public static void main(String[] args) throws IOException {
while (true) {
//创建键盘录入对象,获取键盘录入信息
Scanner sc = new Scanner(System.in);
System.out.println("欢迎来到注册登录界面!");
System.out.println("1.注册");
System.out.println("2.登录");
System.out.println("3.退出");
String choice = sc.nextLine();
//创建一个用户操作类
UserDaoImpl udi = new UserDaoImpl();
//利用switch循环对选择进行操作
switch(choice){
case "1":
System.out.println("欢迎来到注册界面!");
System.out.println("请输入用户名:");
String userName = sc.nextLine();
System.out.println("请输入密码:");
String passWord = sc.nextLine();
User user = new User(userName,passWord);
udi.regist(user);
System.out.println("注册成功!");
break;
case "2":
System.out.println("欢迎来到登录界面!");
System.out.println("请输入用户名:");
String inputUserName = sc.nextLine();
System.out.println("请输入密码:");
String InputPassWord = sc.nextLine();
if (udi.isLogin(inputUserName,InputPassWord)) {
System.out.println("登陆成功!可以玩游戏了!");
GuessNumber.playGame();
}else{
System.out.println("登录失败!");
}
break;
case "3":
default:
//对于3或者其他数字的选择,都直接退出系统
System.exit(0);
break;
}
}
}
}
运行结果:
登录的注册的运行结果:
猜数字游戏后退出系统:
案例实现过程中遇到的小问题:
如果用下面这个构造来创建高效字符输出流对象,程序每运行一次,新输入的用户信息会把之前的用户信息覆盖掉,文件中只有最近一次存入的用户信息。
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt");
如何解决这个问题:
我们用下面这个构造来创建高效字符输出流来给文件写入数据,创建了一个可以追加写入的FileWriter,避免了文件中之前的用户信息被覆盖。
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true));
参考:
FileWriter(String fileName, boolean append)
//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象
例如:我注册了三次,文件中就有了这三次存入的用户信息。
System.out.println("小了,请继续输入:");
number=sc.nextInt();
}
}
}
}
(5)测试类(Test)。
package com.edu.test;
import java.io.IOException;
import java.util.Scanner;
import com.edu.dao.impl.UserDaoImpl;
import com.edu.domain.User;
import com.edu.game.GuessNumber;
public class Test {
public static void main(String[] args) throws IOException {
while (true) {
//创建键盘录入对象,获取键盘录入信息
Scanner sc = new Scanner(System.in);
System.out.println("欢迎来到注册登录界面!");
System.out.println("1.注册");
System.out.println("2.登录");
System.out.println("3.退出");
String choice = sc.nextLine();
//创建一个用户操作类
UserDaoImpl udi = new UserDaoImpl();
//利用switch循环对选择进行操作
switch(choice){
case "1":
System.out.println("欢迎来到注册界面!");
System.out.println("请输入用户名:");
String userName = sc.nextLine();
System.out.println("请输入密码:");
String passWord = sc.nextLine();
User user = new User(userName,passWord);
udi.regist(user);
System.out.println("注册成功!");
break;
case "2":
System.out.println("欢迎来到登录界面!");
System.out.println("请输入用户名:");
String inputUserName = sc.nextLine();
System.out.println("请输入密码:");
String InputPassWord = sc.nextLine();
if (udi.isLogin(inputUserName,InputPassWord)) {
System.out.println("登陆成功!可以玩游戏了!");
GuessNumber.playGame();
}else{
System.out.println("登录失败!");
}
break;
case "3":
default:
//对于3或者其他数字的选择,都直接退出系统
System.exit(0);
break;
}
}
}
}
运行结果:
登录的注册的运行结果:
猜数字游戏后退出系统:
案例实现过程中遇到的小问题:
如果用下面这个构造来创建高效字符输出流对象,程序每运行一次,新输入的用户信息会把之前的用户信息覆盖掉,文件中只有最近一次存入的用户信息。
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt");
如何解决这个问题:
我们用下面这个构造来创建高效字符输出流来给文件写入数据,创建了一个可以追加写入的FileWriter,避免了文件中之前的用户信息被覆盖。
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true));
参考:
FileWriter(String fileName, boolean append)
//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象
例如:我注册了三次,文件中就有了这三次存入的用户信息。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~