本篇文章讲介绍如何编写简易的图书管理系统,让我们来一起学习这个小程序
一.结果展示
这是我们最终实现的界面效果。不同的操作对象具有不同的操作界面,而每种界面的选项分别用不同的方法来实现,话不多说,下面开始教程
二.框架搭建
2.1创建图书和书架的包存放类
存放书架和图书的类
2.1.1创建图书类
创建一个图书类,用于存放图书的属性,例如:书名,类型,作者,价格,是否被借出等。同时为类生成构造方法,获取或者设置书的各项数据,代码实现如下
public class book {
private String name;
private String author;
private int price;
private String type;
private boolean isLend;
public book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(int price) {
this.price = price;
}
public void setType(String type) {
this.type = type;
}
public void setIsLend(boolean isLend) {
this.isLend = isLend;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public int getPrice() {
return price;
}
public String getType() {
return type;
}
public boolean isIsLend() {
return isLend;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isLend?" 已借出":" 未借出")+
'}';
}
}
2.1.2 创建书架类
书架类用于存储图书,我们可以通过创建一个图书类型的数组用于存储图书,并在需要访问对应图书时通过访问书架 获取图书。实现代码如下
package Book;
public class Booklist {
private book[] books = new book[10];//书架的大小
private int usedSize;//记录存放了多少本书
public Booklist(){
books[0] =new book("三国演义","罗贯中",10,"小说");
books[1] =new book("西游记","吴承恩",12,"小说");
books[2] =new book("红楼梦","曹雪芹",9,"小说");
this.usedSize = 3;
}
public book[] getBooks() {//获取书架
return books;
}
public book getbook(int pos){//获取到书架某个位置的图书
return books[pos];
}
public int getUsedSize() {//获取书架存放多少本书
return usedSize;
}
public void setbooks(int pos,book boak){//为书架的一个位置设置书
books[pos] = boak;
}
public void setUsedSize(int usedSize) {//获取书架里存放多少本书
this.usedSize = usedSize;
}
public boolean isFull(){ //获取书架是否装满
if(this.usedSize == books.length){
return true;
}
return false;
}
}
为了方便展示,在创建书架的时候为书架添加三本书,此处展示为存储10本书的书架,可以更改书架的数量
2.2创建用户
在展示界面可以看到系统具有两种用户,分别为管理员和普通用户,作为用户存在共同的特征例如:名字,菜单方法等 ,我们可以通过继承来创建不同的用户类,可以增强代码的可读行,
创建一个用户的包存放用户v
2.2.1.创建用户类(User)
在用户类中,存放用户的基本数据,代码如下
package user;
import Book.Booklist;
import operation.IOperation;
public abstract class User {
protected String name;//用户名称
protected IOperation[] iOperations;
public User(String name){
this.name = name;
}
public abstract int menu();
public void doIoperation(int choice,Booklist booklist){
this.iOperations[choice].work(booklist);
}
}
2.2.2.创建管理员类(AdminUser)
管理员类用于实现菜单页面同时要实现选择功能,每一个功能对应不同的方法。将方法通过数组的形式封装起来,同时注意方法的存放顺序。代码如下
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation(),
};
}
public int menu(){
Scanner scan = new Scanner(System.in);
System.out.println("********管理员菜单*******");
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("请选择:");
int choice = scan.nextInt();
return choice;
}
}
2.2.3.创建普通用户类(NormalUser)
与管理员类基本一致代码如下
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowedOperation(),
new ReturnOperation()
};
}
public int menu(){
Scanner scan = new Scanner(System.in);
System.out.println("********普通用户菜单*******");
System.out.println(" 1.查找图书");
System.out.println(" 2.借出图书");
System.out.println(" 3.归还图书");
System.out.println(" 0.退出系统");
System.out.println("*************************");
System.out.println("请选择:");
int choice = scan.nextInt();
return choice;
}
}
2.3创建功能类实现系统的功能
2.3.1创建功能的包存放功能类,在类内实现功能的方法
2.3.2功能类的搭建
类的创建入上所示,每个类内存在一个work方法,为了方便在后面调用方法,通过实现接口的方式将功能串起来,所有的功能类都实现了IOperation接口,接口中只有一个抽线方法work,
代码如下
package operation;
import Book.Booklist;
public interface IOperation {
public void work(Booklist booklist);
}
2.3.3功能代码的实现
1.查找图书(FindOperation)
输入所需要查找的书名,同个遍历书架数组获取与输入名相同的图书,通过toString方法将图书的信息进行输出,
实现代码如下:
import Book.book;
import java.util.Scanner;
public class FindOperation implements IOperation{
public void work(Booklist booklist){
System.out.println("查找图书");
System.out.println("请输入查找的书名:");
Scanner scan = new Scanner(System.in);
String name = scan.nextLine();
int currentSize = booklist.getUsedSize();//获取书架的长度
for(int i = 0;i<currentSize;i++){ //遍历书架
book book = booklist.getbook(i);
if(book.getName().equals(name)){ //判断书名
System.out.println("找到了");
System.out.println(book);
return;
}
}
System.out.println("没有你要找的书");
return ;
}
}
2.展示图书(ShowOperation)
直接通过遍历书架的方式将所有的图书展示出来了,实现过程与查找类似。
代码如下:
package operation;
import Book.Booklist;
public class ShowOperation implements IOperation {
public void work(Booklist booklist){
System.out.println("查看图书...");
int currentSize = booklist.getUsedSize();
for(int i =0;i<currentSize;i++){
System.out.println(booklist.getbook(i));
}
System.out.println("一共有"+booklist.getUsedSize()+"本书");
return;
}
}
3.添加图书(AddOperation)
添加图书的实现,首先需要判断书架能否存放新的书,然后获取到书架没有书的位置,通过调用setbook方法将书的属性放进书架。
实现代码如下:
package operation;
import Book.Booklist;
import Book.book;
import java.awt.print.Book;
import java.util.Scanner;
public class AddOperation implements IOperation {
public void work(Booklist booklist){
if(booklist.isFull()){
System.out.println("书架满了");
return;
}
Scanner scan = new Scanner(System.in);
System.out.println("新增图书...");
System.out.println("请输入新增的书名:");
String name = scan.nextLine();
System.out.println("请输入书的作者:");
String author = scan.nextLine();
System.out.println("请输入书的价格:");
int price = scan.nextInt();
System.out.println("请输入书的类型:");
String type = scan.nextLine();
book books = new book(name,author,price,type);//创建一本新书
int currentSize = booklist.getUsedSize();
booklist.setbooks(currentSize,books);//将新书放进书架
booklist.setUsedSize(currentSize+1);//图书的数量+1
System.out.println("添加图书成功");
}
}
4删除图书(DelOperation)
删除图书需要先找到你要删除读书的位置,通过将后一本书覆盖前一本书的方式将书删除,实现代码如下:
package operation;
import Book.Booklist;
import Book.book;
import java.util.Scanner;
public class DelOperation implements IOperation {
public void work(Booklist booklist){
System.out.println("删除图书...");
Scanner scan = new Scanner(System.in);
System.out.println("请输入删除的书名:");
String name = scan.nextLine();
int pos = -1;
int i = 0;
int currentSize = booklist.getUsedSize();
for(;i<currentSize;i++){
book book = booklist.getbook(i);
if(book.getName().equals(name)){
//System.out.println("找到了");
pos = i;
for(int j = i;j<currentSize-1;j++){
book lbook = booklist.getbook(j+1);
booklist.setbooks(j,lbook);
}
booklist.setUsedSize(currentSize-1);
booklist.setbooks(currentSize-1,null);
break;
}
}
if(i >= currentSize){
System.out.println("没找到你要的书;");
}
}
}
5.借出图书(BorrowedOperation)
通过查找书名的方式访问到图书,将图书的属性设置成借出状态,同时需要判断这本书的状态是否已经被借出,
ps:默认为false为未借出
实现代码如下:
package operation;
import Book.Booklist;
import java.util.Scanner;
public class BorrowedOperation implements IOperation{
public void work(Booklist booklist){
Scanner scan = new Scanner(System.in);
System.out.println("借出图书...");
String name = scan.nextLine();
int currentSize = booklist.getUsedSize();
for(int i = 0;i<currentSize;i++){
if(booklist.getbook(i).getName().equals(name)){
System.out.println("找到了");
if(booklist.getbook(i).isIsLend()){
System.out.println("这本书并未借出,成功借出");
booklist.getbook(i).setIsLend(true);
return;
}else{
System.out.println("这本书已被借出,借出失败");
return;
}
}
}
System.out.println("未找到你要的书");
}
}
6.归还图书(ReturnOperation)
实现代码与借出图书一致
代码如下:
package operation;
import Book.Booklist;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
public void work(Booklist booklist){
System.out.println("归还图书...");
Scanner scan = new Scanner(System.in);
String name = scan.nextLine();
int currentSize = booklist.getUsedSize();
for(int i = 0;i<currentSize;i++){
if(booklist.getbook(i).getName().equals(name)){
System.out.println("找到了");
if(booklist.getbook(i).isIsLend()){
System.out.println("这本书已被借出,归还成功");
booklist.getbook(i).setIsLend(false);
return;
}else{
System.out.println("这本书并未借出,归还失败");
return;
}
}
}
System.out.println("书架中并没有这本书需要归还");
}
}
7.退出系统(ExitOperation)
退出系统可以用到System.exit方法直接结束程序实现,值得注意的是在结束是为了防止内存泄漏,可以通过遍历数组的方式将书架的内存先释放后退出系统,可以不做
实现代码如下:
package operation;
import Book.Booklist;
public class ExitOperation implements IOperation {
public void work(Booklist booklist){
System.out.println("退出系统...");
System.exit(0);
}
}
三.主函数
在主函数中进行系统的登陆操作,需要在登陆的过程中实例化用户对象,和实例化书架对象,
实现代码如下:
import Book.Booklist;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class main {
public static User login(){
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = scan.nextLine();
System.out.println("请输入你的身份:1.管理员 2.普通用户");
int choice = scan.nextInt();
if(choice == 1){
AdminUser adminUser = new AdminUser(name);
return adminUser;
}else{
NormalUser normalUser = new NormalUser(name);
return normalUser;
}
}
public static void main(String[] args) {
Booklist booklist = new Booklist();
User user = login();
while (true){
int choice = user.menu();
user.doIoperation(choice,booklist);
}
}
}
四.总结
程序的介绍就到此为止,新人博客写的还是差强人意,很多地方不会解释还请谅解,图书管理系统作为初学者学习java语言是一次不错的项目,可以通过练习这个项目掌握javaSE的大部分内容,最后感谢大家观看。