武汉理工大学-Java面向对象与多线程综合实验-(1)封装、继承与多态

实验目标

实现一个档案管理系统的用户管理模块的初步模型。功能包括:密码机制的登录界面;普通用户对自身信息的查询、修改;管理员用户对其他用户信息的增添、删除、修改。

模块解析

用户分为:Administrator 档案管理员,负责管理所有用户的信息;Browser 档案浏览员,负责文件的上传与下载;Operator 档案录入员,可进行文件的下载与浏览。三者对应初始用户分别为 kate、rose、jack,密码均为123。

模块结构图:
在这里插入图片描述
模块具体实现:
1)完成了用户类 User 各属性的封装,并构造 setter()、getter() 方法实现属性访问;
2)不同的角色类 Administrator、Operator、Browser 继承于用户类 User;
3)通过多态实现不同菜单的展示,根据用户角色的不同,系统自动调用对应角色的 showMenu() 方法;
4)本实验未涉及数据库,故使用 DataProcessing 类的成员 users 存储用户信息 (数据类型为 Hashtable 哈希表),且类内部有一系列方法可对 users 进行增删查改。每次角色类需要对用户进行操作时,调用 DataProcessing 类中的方法实现操作。
5)本实验未涉及I/O流,故对文件操作时仅打印语句。

源代码

·DataProcessing

import java.util.*;

public class DataProcessing {

	// 哈希表
	// 存储模式类似于python的字典,以键值对方式存储
	static Hashtable<String, User> users;
	// 三个初始化用户
	static {
		users = new Hashtable<String, User>();
		users.put("rose", new Browser("rose", "123", "browser"));
		users.put("jack", new Operator("jack", "123", "operator"));
		users.put("kate", new Administrator("kate", "123", "administrator"));
	}

	// 查找用户
	public static User searchUser(String name) {
		if (users.containsKey(name)) {
			return users.get(name);
		}
		return null;
	}

	// 密码查找用户
	public static User search(String name, String password) {
		if (users.containsKey(name)) {
			User temp = users.get(name);
			if ((temp.getPassword()).equals(password))
				return temp;
		}
		return null;
	}

	// 获取所有用户
	public static Enumeration<User> getAllUser() {
		Enumeration<User> e = users.elements();
		return e;
	}

	// 更新用户信息
	public static boolean update(String name, String password, String role) {
		User user;
		if (users.containsKey(name)) {
			if (role.equalsIgnoreCase("administrator"))
				user = new Administrator(name, password, role);
			else if (role.equalsIgnoreCase("operator"))
				user = new Operator(name, password, role);
			else
				user = new Browser(name, password, role);
			users.put(name, user);
			return true;
		} else
			return false;
	}

	// 增添新用户
	public static boolean insert(String name, String password, String role) {
		User user;
		if (users.containsKey(name))
			return false;
		else {
			if (role.equalsIgnoreCase("administrator"))
				user = new Administrator(name, password, role);
			else if (role.equalsIgnoreCase("operator"))
				user = new Operator(name, password, role);
			else
				user = new Browser(name, password, role);
			users.put(name, user);
			return true;
		}
	}

	// 删除用户
	public static boolean delete(String name) {
		if (users.containsKey(name)) {
			users.remove(name);
			return true;
		} else
			return false;
	}

}

DataProcessing 类负责用户信息的管理,需要注意的是 Hashtable 结构的用法:例如 put() 加入新的键值对,get() 返回对应键的值,containsKey() , remove() 等等,需要了解熟悉。

·User

public abstract class User {

	private String name;
	private String password;
	private String role;

	User(String name, String password, String role) {
		this.name = name;
		this.password = password;
		this.role = role;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	public abstract void showMenu();

	public boolean downloadFile(String fileID) {
		System.out.println("下载文件... ...");
		System.out.println("下载成功!");
		return true;
	}

	public void showFileList() {
		System.out.println("列表... ...");
	}

	public boolean changeSelfInfo(String password) {
		if (DataProcessing.update(name, password, role)) {
			this.password = password;
			return true;
		} else
			return false;
	}

	public void exitSystem() {
		System.out.println("系统退出, 谢谢使用 ! ");
		System.exit(0);
	}

}

·Administrator

import java.util.Map.Entry;
import java.util.Scanner;

public class Administrator extends User {

	public Administrator(String name, String password, String role) {
		super(name, password, role);
	}

	// 删除用户
	public void delUser(String input_name) {
		if (DataProcessing.delete(input_name)) {
			System.out.println("删除成功!");
		} else {
			System.out.println("删除失败!查找不到用户名!");
		}
	}

	// 添加用户
	public void addUser(String input_name, String input_password, String input_role) {
		if (DataProcessing.insert(input_name, input_password, input_role)) {
			System.out.println("添加成功!");
		} else {
			System.out.println("删除失败!用户名已存在!");
		}
	}

	// 列出用户
	public void listUser() {
		for (Entry<String, User> u : DataProcessing.users.entrySet()) {
			String print_name = u.getValue().getName();
			String print_password = u.getValue().getPassword();
			String print_role = u.getValue().getRole();
			System.out.println("Name:" + print_name + " Password:" + print_password + " Role:" + print_role);
		}
	}

	@SuppressWarnings("resource")
	public void showMenu() {

		Scanner scan1 = new Scanner(System.in);
		Scanner scan2 = new Scanner(System.in);
		Scanner scan3 = new Scanner(System.in);
		Scanner scan4 = new Scanner(System.in);

		// 控制界面的开关
		boolean administrator_isopen = true;
		// 记录用户的选择
		String administrator_choice;

		while (administrator_isopen) {

			// 界面显示
			System.out.println("=======欢迎进入档案管理员菜单=======");
			System.out.println("           1.修改用户");
			System.out.println("           2.删除用户");
			System.out.println("           3.新增用户");
			System.out.println("           4.列出用户");
			System.out.println("           5.下载文件");
			System.out.println("           6.文件列表");
			System.out.println("           7.修改密码");
			System.out.println("           8.退    出");
			System.out.println("====================================");
			System.out.print("请输入选项:");
			administrator_choice = scan1.next();

			if (administrator_choice.equals("1")) {

				// 输入用户信息
				System.out.print("请输入用户名:");
				String input_name = scan2.next();
				System.out.print("请输入密码:");
				String input_password = scan3.next();

				// 密码查找用户
				if (DataProcessing.search(input_name, input_password) != null) {

					System.out.print("请输入身份:");
					String input_role = scan4.next();

					// 修改用户
					if (DataProcessing.update(input_name, input_password, input_role)) {
						System.out.println("修改成功!");
					} else {
						System.out.println("修改失败!查找不到用户名!");
					}

				} else {
					System.out.println("用户名与密码不符!");
				}

			} else if (administrator_choice.equals("2")) {

				System.out.print("请输入用户名:");
				String input_name = scan2.next();

				// 删除用户
				this.delUser(input_name);

			} else if (administrator_choice.equals("3")) {

				System.out.print("请输入用户名:");
				String input_name = scan2.next();
				System.out.print("请输入密码:");
				String input_password = scan3.next();
				System.out.print("请输入身份:");
				String input_role = scan4.next();

				// 添加用户
				this.addUser(input_name, input_password, input_role);

			} else if (administrator_choice.equals("4")) {

				// 列出用户
				System.out.println("用户列表");
				this.listUser();

			} else if (administrator_choice.equals("5")) {

				System.out.print("请输入文件名:");
				String filename = scan2.next();

				// 下载文件
				super.downloadFile(filename);

			} else if (administrator_choice.equals("6")) {

				// 列出文件
				System.out.println("文件列表");
				super.showFileList();

			} else if (administrator_choice.equals("7")) {

				System.out.print("请输入新密码:");
				String newpassword = scan2.next();

				// 修改密码
				if (this.changeSelfInfo(newpassword)) {
					System.out.println("修改成功!");
				} else {
					System.out.println("修改失败");
				}

			} else if (administrator_choice.equals("8")) {
				// 界面关闭
				administrator_isopen = false;
			} else {
				System.out.println("输入格式有误!请重新输入!");
			}
		}
	}
}

选项数字采用的是 String 字符串类型而不是 int 整形,这样做是为了防止手贱输入字母出现类型不匹配的异常。showMenu() 方法是通过 while 循环 + 布尔型 isopen 变量实现界面的不断显示,当选择退出选项时 isopen 置为 false,实现界面的退出。

·Browser

import java.util.Scanner;

public class Browser extends User {

	public Browser(String name, String password, String role) {
		super(name, password, role);
	}

	@SuppressWarnings("resource")
	public void showMenu() {

		Scanner scan1 = new Scanner(System.in);
		Scanner scan2 = new Scanner(System.in);

		// 控制界面的开关
		boolean browser_isopen = true;
		// 记录用户的选择
		String browser_choice;

		while (browser_isopen) {

			// 界面显示
			System.out.println("=======欢迎进入档案浏览员菜单=======");
			System.out.println("            1.下载文件");
			System.out.println("            2.文件列表");
			System.out.println("            3.修改密码");
			System.out.println("            4.退    出");
			System.out.println("====================================");
			System.out.print("请输入选项:");
			browser_choice = scan1.next();

			if (browser_choice.equals("1")) {

				System.out.print("请输入档案号:");
				String fileID = scan2.next();

				// 下载文件
				super.downloadFile(fileID);

			} else if (browser_choice.equals("2")) {

				// 列出文件
				System.out.println("文件列表");
				super.showFileList();

			} else if (browser_choice.equals("3")) {

				System.out.print("请输入新密码:");
				String newpassword = scan2.next();

				// 修改密码
				if (this.changeSelfInfo(newpassword)) {
					System.out.println("修改成功!");
				} else {
					System.out.println("修改失败");
				}

			} else if (browser_choice.equals("4")) {
				// 关闭页面
				browser_isopen = false;
			} else {
				System.out.println("输入格式有误!请重新输入!");
			}

		}
	}
}

· Operator

import java.util.Scanner;

public class Operator extends User {

	public Operator(String name, String password, String role) {
		super(name, password, role);
	}

	// 上传文件
	@SuppressWarnings({ "resource", "unused" })
	public void uploadFile() {

		Scanner scan1 = new Scanner(System.in);
		Scanner scan2 = new Scanner(System.in);
		Scanner scan3 = new Scanner(System.in);

		System.out.println("上传文件");

		System.out.print("请输入文件名:");
		String filename = scan1.next();
		System.out.print("请输入档案号:");
		String fileID = scan2.next();
		System.out.print("请输入档案描述:");
		String fileDescrption = scan3.next();
		System.out.println("上传成功!");

	}

	@SuppressWarnings({ "resource" })
	public void showMenu() {

		Scanner scan1 = new Scanner(System.in);
		Scanner scan2 = new Scanner(System.in);

		// 控制页面的开关
		boolean operator_isopen = true;
		// 记录用户的选择
		String operator_choice;

		while (operator_isopen) {

			// 显示页面
			System.out.println("=======欢迎进入档案录入员菜单=======");
			System.out.println("            1.上传文件");
			System.out.println("            2.下载文件");
			System.out.println("            3.文件列表");
			System.out.println("            4.修改密码");
			System.out.println("            5.退    出");
			System.out.println("====================================");
			System.out.print("请输入选项:");
			operator_choice = scan1.next();

			if (operator_choice.equals("1")) {

				// 上传文件
				this.uploadFile();

			} else if (operator_choice.equals("2")) {

				System.out.print("请输入文件名:");
				String filename = scan2.next();

				// 下载文件
				super.downloadFile(filename);

			} else if (operator_choice.equals("3")) {

				// 列出文件
				System.out.println("文件列表");
				super.showFileList();

			} else if (operator_choice.equals("4")) {

				System.out.print("请输入新密码:");
				String newpassword = scan2.next();

				// 修改密码
				if (this.changeSelfInfo(newpassword)) {
					System.out.println("修改成功!");
				} else {
					System.out.println("修改失败");
				}

			} else if (operator_choice.equals("5")) {
				// 关闭界面
				operator_isopen = false;
			} else {
				System.out.println("输入格式有误!请重新输入!");
			}
		}
	}
}

·Main

import java.util.Scanner;

public class Main {

	@SuppressWarnings({ "resource" })
	public static void main(String[] args) {

		Scanner scan1 = new Scanner(System.in);
		Scanner scan2 = new Scanner(System.in);
		Scanner scan3 = new Scanner(System.in);

		// 控制界面的开闭
		boolean main_isopen = true;
		// 用于记录用户的选择
		String main_choice;

		while (main_isopen) {

			// 界面显示
			System.out.println("=======欢迎进入档案系统=======");
			System.out.println("           1.登   录 ");
			System.out.println("           2.退   出 ");
			System.out.println("==============================");
			System.out.print("请输入选项:");
			main_choice = scan1.next();

			if (main_choice.equals("1")) {

				// 输入用户信息
				System.out.print("请输入用户名:");
				String input_name = scan2.next();
				System.out.print("请输入密码:");
				String input_password = scan3.next();

				// 对密码正确性的检查
				User user = DataProcessing.search(input_name, input_password);
				if (user == null) {
					System.out.println("用户名与密码不符!");
				} else {
					// 打开对应身份的界面
					user.showMenu();
				}

			} else if (main_choice.equals("2")) {
				// 退出情况,将界面关闭
				main_isopen = false;
			} else {
				// 格式输入错误的情况
				System.out.println("输入格式有误!请重新输入!");
			}

		}
		System.out.println("系统退出,感谢使用!");
	}

}

写在最后

声明:本文内容来源于武汉理工大学2019-2020学年Java编程实验,仅供学习参考。如有不足错误地方,还请指出。
代码不要无脑抄,很多细节没有详细讲解,需要读者自行理解。编程是实践练出来的,祝愿读者在编程之路上不断进步!

发布了3 篇原创文章 · 获赞 0 · 访问量 179

猜你喜欢

转载自blog.csdn.net/weixin_43381409/article/details/104042965