这是我的第一个项目,虽然十分的简单,在这个项目中使用了多态、继承以及接口实现等方法。
首先要明确图书管理系统的功能是什么,其实无非是增删改查,同时也分两种身份的使用系统;
作为管理员所拥有的的权限为:查阅书籍、增加书籍、删除书籍、查看书籍列表、退出程序;
而非管理员即普通用户的权限仅限于查阅书籍、借阅书籍、归还书籍以及通用的退出程序。
在明确了需要实现什么样的功能之后,就要开始构建结构了,是的,不是马上开始写功能代码,而是把整个框架先构建起来!!主要类有哪些?通过什么途径去调用功能代码等等都是我们需要考虑的事情!
我将程序分为四个部分——主程序部分,书籍部分,用户部分以及功能部分;
书籍部分
先说书籍部分,将书籍分为两个类去实行——Book类、BookList类。
Book类主要是为了描述一本书,书籍名字、作者、价格、类型、借阅情况;
BookList类顾名思义就是书籍列表,用于存储书籍的,那么这个类是怎样存储书籍的呢?BookList类通过使用Book类创建一个Book类型的数组,数组中存放的就是一本本的书籍;
//定义数组
Book[] bookList = new Book[100];
//初始化数组
bookList[0] = new Book("三国演义", "罗贯中", 100, "古典小说", false);
bookList[1] = new Book("水浒传", "施耐庵" , 70, "古典小说", false);
bookList[2] = new Book("带着仓库到大明", "迪巴拉爵士", 65, "历史架空文", false);
Book类完整代码
public class Book {
private String name;//书名
private String author;//作者
private double price;//价格
private String type;//小说类型
private boolean is_borrow;//状态,是否被借出
public Book(String name, String author, double price, String type, boolean is_borrow) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
this.is_borrow = is_borrow;
}
public boolean getIs_borrow() {
return is_borrow;
}
public String getName() { return name; }
public void setIs_borrow(boolean is_borrow)
{
this.is_borrow = is_borrow;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", is_borrow='" + is_borrow + '\'' +
'}';
}
}
BookList类完整代码
public class BookList {
private Book[] bookList = new Book[100];
private int size;
public BookList(){
assert false;
bookList[0] = new Book("三国演义", "罗贯中", 100, "古典小说", false);
bookList[1] = new Book("水浒传", "施耐庵" , 70, "古典小说", false);
bookList[2] = new Book("带着仓库到大明", "迪巴拉爵士", 65, "历史架空文", false);
size = 3;
}
public Book getBookList(int index) {
return bookList[index];
}
public void setBookList(int index,Book book) {
this.bookList[index] = book;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
用户部分
用户分为管理员和普通用户,管理员使用Admin实现,普通用户使用GeneralUser实现,由于这两个类的方法及其相似,所以它们都继承自User这个抽象类;
用户结构是图书管理代码中一个比较关键的部分,其把功能部分和书籍部分给串合在了一起,具体的实现方法是这样的:功能代码部分都实现了Function这个接口,而在User中通过创建Function类型的数组来实现了用户进行功能操作的部分,具体怎么实现如下:
User类
abstract public class User {
protected String name;
protected Function[] function;
abstract public int menu();
public void UseFunction(int choise, BookList bookList){
function[choise - 1].work(bookList);
}
}
Admin类
public class Admin extends User{
public Admin(String name) {
this.name = name;
function = new Function[]{
new FindBooks(),
new AddBooks(),
new DelBooks(),
new LookBookList(),
new Eixt()
};
}
@Override
public int menu() {
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("请选择要进行的操作:>");
Scanner scanner = new Scanner(System.in);
int choise = scanner.nextInt();
return choise;
}
public static boolean password(String password){
String pass = "123456";
if(password.equals(pass)){
return true;
}
return false;
}
}
GeneralUser类
public class GeneralUser extends User{
public GeneralUser(String name) {
this.name = name;
function = new Function[]{
new FindBooks(),
new BorrowBooks(),
new ReturnBooks(),
new Eixt()
};
}
@Override
public int menu() {
System.out.println("1、查阅书籍");
System.out.println("2、借阅书籍");
System.out.println("3、归还书籍");
System.out.println("4、退出程序");
System.out.println("=========================");
System.out.print("请选择要进行的操作:>");
Scanner scanner = new Scanner(System.in);
int choise = scanner.nextInt();
return choise;
}
}
功能部分
功能部分是整个图书管理系统中最关键但也是最简单的一部分,关键在于它主要实现了图书管理系统增删改查的功能,简单在于框架构造完毕之后只要使用简单的数组知识便能够完成;
由于在用户部分我们使用数组的方式调用了功能代码,所以只需要将全部功能实现出来即可,首先是创建一个接口,其他类来实现这个接口以完成对应的功能。
那么为什么要创建接口,而不是直接调用子类呢?其实是为了简化代码,java调用类中方法是需要实例化对象的,图书管理系统有近十个功能,每个都创建实例化来实现就显得太过于臃肿,所以干脆创建一个接口,由接口创建数组,根据menu传递过来的chioce来获取数组中对应位置的对应实例化的work功能。
public void UseFunction(int choise, BookList bookList){
function[choise - 1].work(bookList);
}
假如在Admin中的第 1 个元素是增加书籍,那么当用户输入 2 的时候,就会调用UseFunction方法中的function[1],而这个function所对应的就是增加书籍的实例化,然后通过操作符“.”来调用work方法,上述的代码在输入 2 的情况下其实就是这样:AddBooks.work(bookList);
主程序部分
主程序非常简单,因为复杂的程序都放在了主程序的外面,只需要调用就可以了
public class Main {
public static void main(String[] args) {
BookList bookList = new BookList();
User user = Login();
while(true){
try{
int choise = user.menu();
user.UseFunction(choise, bookList);
}catch(Exception e){
System.out.println(e);
}
}
}
while语句中使用了异常报错的代码 try-catch,当我们在输入选项出错的时候也不会因为输入错误而直接错误的结束程序,而是会告诉你这里出错了但还是会继续执行输入选项操作,也就是说 try-catch 保证了程序只有在 输入退出程序对应选项的时候才会结束,具体如下:
1、查阅书籍
2、增加书籍
3、删除书籍
4、查看书籍列表
5、退出程序
=========================
请选择要进行的操作:>124242
java.lang.ArrayIndexOutOfBoundsException: 124241
1、查阅书籍
2、增加书籍
3、删除书籍
4、查看书籍列表
5、退出程序
=========================
请选择要进行的操作:>
User user = Login()使用了向上转型的放法,使得使用user就能够调用到Admin或者GeneralUser的方法,Login()返回值就是Admin或者GeneralUser的实例化
private static User Login() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的用户名:>");
String name = scanner.next();
System.out.println("1、管理员模式 0、普通用户模式");
System.out.print("请选择模式:>");
int who = scanner.nextInt();
while(true){
if(who == 1){
System.out.print("请输入管理员密码:>");
String password = scanner.next();
if(Admin.password(password)){
System.out.println("密码正确!登录成功!");
System.out.println("=========================");
System.out.println(name + "欢迎登录图书管理系统!");
return new Admin(name);
}
}else if(who == 0){
System.out.println("=========================");
System.out.println(name + "欢迎登录图书管理系统!");
System.out.println("登录成功!");
return new GeneralUser(name);
}
}
}
结束
到此,整个图书管理系统就完结了,大家有什么指教或者有什么问题想不明白的可以在下面评论处评论!!!
完整代码
https://gitee.com/CGQ4568/java-se/tree/master/Library_System