整体思路
首先我们先来看一下我们要达到的效果
我们得有登录的姓名,与身份的选择
选择不同的身份对应不同的功能
比如选择管理员
选择普通用户
得有我们的图书
博主在这里实现图书管理系统分为四个包进行实现
不会创建包的小伙伴可以去下方链接了解一下
book包里面实现书类和书架类
opera包里我们用接口实现我们所需要在图书管理系统里实现的功能
testmain包里是我们的主函数所在
user包里用继承来实现我们所需要的管理者与借阅者类
实现所有类如下
接下来我会就每个里面的类进行讲解
Book包
Book类
在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法
代码实现如下
package book; public class Book { private String name;//书名 private String author;//作者 private int price;//价钱 private String type;//类型 private boolean isBorrowed;//是否被借阅 //构造方法 public Book(String name, String author, int price, String type) { this.name = name; this.author = author; this.price = price; this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getType() { return type; } public void setType(String type) { this.type = type; } public boolean isBorrowed() { return isBorrowed; } public void setBorrowed(boolean borrowed) { isBorrowed = borrowed; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + (isBorrowed?" 已借阅":" 未借阅")+ '}'; } }
BookList类
这里我们需要实现的有可以存放很多Book的数组
可以与增加、删除等功能的对应方法
代码实现
package book; public class BookList { //定义常量 private static final int DEFAULT_SIZE = 20; //创建一个Book类型的数组,books里面存放的是多个book类型实例化的对象 private Book[] books = new Book[DEFAULT_SIZE]; //记录当前books数组当中 有多少本书? private int usedSize; public BookList() { books[0] = new Book("剑来","烽火戏诸侯",88,"修仙小说") ; books[1] = new Book("雪中悍刀行","烽火戏诸侯",66,"武侠小说"); books[2] = new Book("流浪地球","刘慈欣",99,"科幻小说"); books[3] = new Book("木苏里","某某",88,"爱情小说") ; books[4] = new Book("天官赐福","墨香铜臭",66,"爱情小说"); books[5] = new Book("镇魂","priest",99,"爱情小说"); //表示最初是三本 this.usedSize = 6; } //读取这一本书 public Book getBooK(int pos) { return this.books[pos]; } //将该书写入该下标对应的位置,可以实现增加图书 public void setBook(Book book) { this.books[usedSize] = book; } //后面会用于读取图书 public int getUsedSize() { return usedSize; } //用于写入数组下标,与增加删除功能都有关系 public void setUsedSize(int usedSize) { this.usedSize = usedSize; } }
user包
User类
这里的User类是作为NormalUser类与AdminUser类的父类
有相应的属性name与构造方法
会提供一个数组,供子类进行使用
有一个抽象类实现菜单
有一个方法会对用户选择后的结果进行传达,然后调用相对应功能的方法
实现代码
package user; import book.BookList; import opera.IOPeration; public abstract class User { protected String name; protected IOPeration[] ioPerations; public User(String name) { this.name = name; } //创建一个抽象类,实现菜单 public abstract int menu(); //通过对象的相应调用与所传参数实现操作者选择的功能 public void doWork(int choice, BookList bookList) { this.ioPerations[choice].work(bookList); } }
NormalUser类
普通用户类,继承于User类
这里涉及一个数组,里面用于存放一些对象,来实现普通用户的功能
一个可以让用户选择的菜单,以及返回用户所做的选择
package user; import opera.*; import java.util.Scanner; /** * @Author 12629 * @Description: */ public class NormalUser extends User{ public NormalUser(String name) { super(name); //对ioPerations数组进行初始化,里面放的是使用者所需要功能类的对象 ioPerations = new IOPeration[] { //0.退出系统 new ExitOperation(), //1.查找图书 new FindOperation(), //2.借阅图书 new BrrowOperation(), //3.归还图书 new ReturnOperation() }; } public int menu() { System.out.println("****************************"); System.out.println("hello "+name+" 欢迎来到阳光图书馆"); System.out.println("1.查找图书!"); System.out.println("2.借阅图书!"); System.out.println("3.归还图书!"); System.out.println("0.退出系统!"); System.out.println("****************************"); System.out.println("请输入你的操作:"); Scanner scanner = new Scanner(System.in); int choice = scanner.nextInt(); return choice; } }
AdminUser管理员类
管理员类,继承于User类
这里涉及一个数组,里面用于存放一些对象,来实现管理员的功能
一个可以让管理员选择的菜单,以及返回管理员所做的选择
package user; import opera.*; import java.util.Scanner; public class AdminUser extends User{ public AdminUser(String name) { super(name); //对ioPerations数组进行初始化,里面放的是管理员所需要功能类的对象 ioPerations = new IOPeration[] { //0.退出系统 new ExitOperation(), //1、查找图书 new FindOperation(), //2.新增图书 new AddOperation(), //3.删除图书 new DelOperation(), //4.显示图书 new ShowOperation() }; } public int menu() { System.out.println("****************************"); System.out.println("hello "+name+" 欢迎来到阳光图书管"); System.out.println("1.查找图书!"); System.out.println("2.新增图书!"); System.out.println("3.删除图书!"); System.out.println("4.显示图书!"); System.out.println("0.退出系统!"); System.out.println("****************************"); System.out.println("请输入你的操作:"); Scanner scanner = new Scanner(System.in); int choice = scanner.nextInt(); return choice; } }
testmain包
这里需要实现的是
可以根据用户选择不同的身份以及选择身份后所要进行的功能,调用相应的对象实现
代码实现
package testmain; import book.BookList; import user.AdminUser; import user.NormalUser; import user.User; import java.util.Scanner; /** * @Author 12629 * @Description: */ public class Main { public static User login() { System.out.println("请输入你的姓名:"); Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); System.out.println("请输入你的身份:1-》管理员 0-》普通用户"); int choice = scanner.nextInt(); if(choice == 1) { return new AdminUser(name); }else { return new NormalUser(name); } } public static void main(String[] args) { BookList bookList = new BookList(); //返回来的值进行向上转型 User user = login(); while(true) { //此处是一个简单的多态实现 int choice = user.menu(); //根据 choice 和 user 来确定 我到底 调用哪个对象的哪个操作 user.doWork(choice, bookList); } } }
opera包
这个包利用接口来实现这些功能
IOPeration接口
会有一个work的抽象方法,参数类型为BookList的
代码实现
package opera; import book.BookList; public interface IOPeration { void work(BookList bookList); }
普通用户
ExitOperation类
用于退出该系统
这里的实现很简单,使用System.exit(0);就好
import book.BookList; public class ExitOperation implements IOPeration{ @Override public void work(BookList bookList) { System.out.println("退出系统!"); System.exit(0); } }
FindOperation类
用于查找图书
根据书名对Books数组里面的每一Book类的名字进行比对
package opera; import book.Book; import book.BookList; import java.util.Scanner; public class FindOperation implements IOPeration{ @Override public void work(BookList bookList) { int currenSize = bookList.getUsedSize(); System.out.println("请输入要查找书的名字"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); for(int i = 0;i < currenSize;i++) { Book book = bookList.getBooK(i); if(book.getName().equals(input)){ System.out.println(book); return; } } System.out.println("查找书不存在"); } }
BrrowOperation类
实现借阅功能
根据书名进行遍历是否有该图书
判断该图书的状态
借阅后改变该图书的状态,改为已借阅
代码实现如下
import java.util.Scanner; public class BrrowOperation implements IOPeration { public void work(BookList bookList) { System.out.println("借阅书籍!"); System.out.println("请输入你要借阅的图书的名字:"); Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); int currentSize = bookList.getUsedSize(); for (int i = 0; i < currentSize; i++) { Book book = bookList.getBooK(i); if(name.equals(book.getName())) { if(book.isBorrowed()) { System.out.println("该书已经被借出! "); }else { book.setBorrowed(true); System.out.println("借阅图书成功!"); } return; } } System.out.println("没有你要借阅的图书!"); } }
ReturnOperation类
归还图书
根据书名进行遍历是否有该图书
判断该图书的状态
归还后改变该图书的状态,改为未借阅
代码实现如下
package opera; import book.Book; import book.BookList; import java.util.Scanner; public class ReturnOperation implements IOPeration{ @Override public void work(BookList bookList) { System.out.println("归还图书!"); System.out.println("请输入你要归还的图书的名字:"); Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); int currentSize = bookList.getUsedSize();; for (int i = 0; i < currentSize; i++) { Book book = bookList.getBooK(i); if(name.equals(book.getName())) { book.setBorrowed(true); System.out.println("归还图书成功!"); return; } } System.out.println("没有你要归还的图书!"); } }
管理员
ExitOperation类与FindOperation类为两种身份共有的,这里就不再赘述
AddOperation类
添加书籍
根据书名遍历该书是否已经存在
添加该书的所有属性
对Books数组进行更新,添加;这里就用到了我们前面在BookList里书写的方法,如下图
代码实现如下
package opera; import book.Book; import book.BookList; import java.util.Scanner; public class AddOperation implements IOPeration{ public void work(BookList bookList) { int currenSize = bookList.getUsedSize(); System.out.println("新增图书!"); System.out.println("请输入你要新增的图书的名字:"); Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); for(int i = 0;i < currenSize;i++) { Book book = bookList.getBooK(i); if(book.getName().equals(name)){ System.out.println("所添加书籍已存在"); return; } } System.out.println("请输入你要新增的图书的作者:"); String author = scanner.nextLine(); System.out.println("请输入你要新增的图书的价格:"); int price = scanner.nextInt(); scanner.nextLine(); System.out.println("请输入你要新增的图书的类型:"); String type = scanner.nextLine(); Book book = new Book(name,author,price,type); //1. 获取到当前可以存放书的位置 int currentSize = bookList.getUsedSize(); //2. 把书放入指定位置 bookList.setBook(book); //3. 书的有效个数+1 bookList.setUsedSize(currentSize+1); System.out.println("添加成功"); } }
DelOperation类
删除书籍
根据书名遍历该书是否已经存在
寻找该书的数组下标,实现后面数组对前面的覆盖
现有图书数目减一,并将原来图书书目最后一位置为Null
代码实现
package opera; import book.Book; import book.BookList; import java.util.Scanner; public class DelOperation implements IOPeration{ public void work(BookList bookList) { System.out.println("删除图书!"); System.out.println("请输入你要删除的图书:"); Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); //1. 遍历数组当中 是否有你要删除的书 有记录下标 int index = -1; int currentSize = bookList.getUsedSize();; for (int i = 0; i < currentSize; i++) { Book book = bookList.getBooK(i); if(name.equals(book.getName())) { index = i; break; } } // if(index == -1) { System.out.println("没有你要删除的书!"); return; } for (int i = index; i < currentSize-1 ; i++) { //bookList[i] = bookList[i+1]; Book book = bookList.getBooK(i+1); bookList.setBook(book); } //下标减一 bookList.setUsedSize(currentSize-1); //每次删除 都要置空 bookList.setBook(null); System.out.println("删除成功!"); } }
ShowOperation类
显示图书
遍历Books数组
使用重写的toString方法就好
代码实现
package opera; import book.BookList; import java.sql.SQLOutput; public class ShowOperation implements IOPeration{ @Override public void work(BookList bookList) { int currenSize = bookList.getUsedSize(); for(int i = 0;i < currenSize;i++) { //我们重写了toString,所以这里会优先调用我们重写的toString方法 System.out.println(bookList.getBooK(i)); } System.out.println("显示完毕"); } }
总结
关于《 图书管理系统》就讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。想要完整包的小伙伴可以去到该博文的资源绑定进行下载,也可以私信博主