📚
- 一、前言
- 1.1整体框架
- 二、book包
- 2.1Book
- 2.2BookList
- 三、user包
- 3.1、User
- 3.2、Adminuser
- 3.3、Normaluser
- 四、Operation包
- 4.1、IOperation接口
- 4.2、AddOperattion
- 4.3、ShowOperation
- 4.4、FindOperation
- 4.5、DelOperation
- 4.6、BorrowOperation
- 4.7、ReturnOperation
- 4.8、ExitOperation
- 五、main
一、前言
对于图书管理系统的建立,大家在C语言的学习中或多或少听过甚至写过,如今我们的Java学习进行了不少时候了,这次我么尝试用Java来完成图书管理系统的实现。
1.1整体框架
首先我们最开始要构思好我们这个图书管理系统到底有哪些功能。里面究竟有哪些成员。
(1)图书方面:我们会设计图书的姓名、作者、价格、类型以及是否被借出这五个变量。
(2)书架:我们书籍一定是存放在书架上的。这就需要用一个数组来存储我们的书籍。
(3)使用者:使用者我们设计的是两类,一类是管理员,一类是使用者。这两类实现的功能是不一样的
(4)功能实现:管理者将实现查找、新增、删除、显示、退出系统这五个功能。而使用者将实现查找、借阅、归还、退出系统这四个功能。
为了实现以上多种功能我们创建了三个包
book里面实现book书的定义以及booklist书架的实现;事实上我们可以将方法写在booklist这里,但是为了方便区分以及实现我们单独将实现方法写在一个operation包里面,在这个包里里面实现各种功能;最后定义一个user包里面书写管理者和使用者两个方法。
总览:
二、book包
2.1Book
我们首先定义好各种变量后,创建构造方法以及getter and setter,代码如下:
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;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +//", isBorrowed=" + isBorrowed +(isBorrowed == true ? " 已经被借出" : " 未被借出") + // 这里由+拼接,都是字符串所以我们输入文字'}';}
}
这里我们看到isBorrowed,默认是一个false类型,我们最后打印三目运算符加一个判断是true代表已经被借出,false代表未被借出。
2.2BookList
我们首先给书架提供三本书(这是个例子,实际写多少随便你的,不重要哈哈),然后定义一个usedSize来表示这分书架有多少本书活着也可以理解为这个数组有多长
package book;public class BookList {private static final int DEFAULT_SIZE = 10;private Book[] books = new Book[DEFAULT_SIZE];public BookList() {books[0] = new Book("三国演义","罗贯中",89,"小说");books[1] = new Book("西游记","吴承恩",78,"小说");books[2] = new Book("红楼梦","曹雪芹",49,"小说");this.usedSize = 3;}private int usedSize;// 记录当前books数组当中 有多少本书
开始代码类似于C语言中的宏定义,相信聪明的你一眼就能看懂,一眼丁真啊鉴定为是会做的题。
由于usedSize和这个book都是用private修饰的,我们是不是要给他提供getter and setter方法。
usedSize没毛病但是对于book我们编译器提供的方法不能满足我们的需求的,我们需要在指定位置拿到这一本书,编译器给我们提供的方法是找到这一群书所有的书,显然这需要我们自己来写:
package book;public class BookList {private static final int DEFAULT_SIZE = 10;private Book[] books = new Book[DEFAULT_SIZE];public BookList() {books[0] = new Book("三国演义","罗贯中",89,"小说");books[1] = new Book("西游记","吴承恩",78,"小说");books[2] = new Book("红楼梦","曹雪芹",49,"小说");this.usedSize = 3;}private int usedSize;// 记录当前books数组当中 有多少本书public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book getBook(int pos) {return this.books[pos];}// 上面book使用private封装的,所以我们用这个方法public void setBook(Book book) {this.books[usedSize] = book;}public void setBook(int pos, Book book) {this.books[pos] = book;}
}
最后重载的方法先不要急,后面它一定能用得上😝
三、user包
3.1、User
(1)我们首先不管他到底是管理员还是普通用户至少他们是有共性的比如说姓名啥的,这样我们就可以先写一个User大类然后让他们去继承
(2)在这里注意:我们定义姓名的时候,用public来定义的话太广泛了点用private定义的话只能在当前类里面调用,因此最好的选择就是用protected去修饰。完成后我们给它提供一个构造方法(别忘了在管理员和普通用户中我们,当子类继承父类后我们要帮助父类构造这个方法)。
(3)我们所有的操作的是对象事实上是booklist也就是对暑假的操作,因而我们需要定义一个接口,然后其他功能去继承。user中再提供一个菜单这样的东西,我们来看user的代码:
package user;import Operation.IOPeration;
import book.BookList;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);}
}
3.2、Adminuser
管理员操作,我们先将目录写好,这个变更不复杂,搞清楚了要实现的功能就行。然后重写继承的user构造方法,代码如下:
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() {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;}
}
3.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 BorrowOperation(),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;}
}
这里面的choice暂时不明白没有关系,这就引入到下面很重要的一个操作接口。我们来看
四、Operation包
4.1、IOperation接口
我们都知道所有的操作对象都是书架,那么我们这就好写了,代码:
package Operation;import book.BookList;public interface IOPeration {void work(BookList bookList);
}
后面继承接口方法的当然也要重写
4.2、AddOperattion
新增图书。
(1)新增图书我们第一步继承了接口的work方法后在里面通过Scanner给用户提供模板,书名啥的。
(2)实例化一个book,在新增图书之前我们首先应该判断的是这个书架到底存不存再已经有的书籍,要是有了,我们就不需要再新增图书了。新增成功后currentSize再加1.我们来看代码:
package Operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增图书!");Scanner scanner = new Scanner(System.in);System.out.println("输入书名:");String name = scanner.nextLine();System.out.println("输入作者名:");String author = scanner.nextLine();System.out.println("输入价格:");int price = scanner.nextInt();System.out.println("输入类型:");String type = scanner.nextLine();Book book = new Book(name,author,price, type);int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book tmp = bookList.getBook(i);if(tmp.getName().equals(name)) {System.out.println("已经存在这本书了,不能再放入了");return;}}bookList.setBook(book); //新增图书成功bookList.setUsedSize(currentSize+1);}}
4.3、ShowOperation
其实上面增加功能我们已经写好了显示图书,因为是数组,我们就直接按照数组的模式用循环来一个一个遍历。输出即可:
package Operation;import book.Book;
import book.BookList;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("显示所有图书!");int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}
4.4、FindOperation
快来看,这个方法和上面这两个同样差不多:
package Operation;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOPeration{@Overridepublic 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(book.getName().equals(name)) {System.out.println("找到了这本书!");System.out.println(book);return;// 这是假设我们的书名没有重复}}System.out.println("没有这本书!");}/*public void work(BookList bookList) {System.out.println("查找图书!");}*/
}
4.5、DelOperation
要想删除图书首先我们要查找图书。我们定义一个index表示数组下标,然后后移覆盖
package Operation;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("删除图书!");System.out.println("请输入你要删除的图书的名字:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();// 然后要想删除图书首先我们要查找图书。我们定义一个index表示数组下标,然后后移覆盖int index = -1;int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book tmp = bookList.getBook(i);if(tmp.getName().equals(name)) {index = i;break;}}//挪动数据for (int j = index; j < currentSize-1; j++) {// 我们要实现的效果就是bookList[j]=bookList[j+1]后面数将前覆盖Book book = bookList.getBook(j+1);// 找到j+1的位置bookbookList.setBook(j, book); // j+1位置的book给j位置,这样覆盖就完成了}//修改sizebookList.setUsedSize(currentSize-1);//因为删除的是对象,所以把最后一个置为nullbookList.setBook(currentSize-1,null);System.out.println("删除成功!");}
}
我们注意为什么第二个j循环我们写的是小于currentSize-1。假如是五个元素,index到第五个元素的时候后面j+1就会有越界情况.
到这里我们管理员部分就已经写完辣。下面写普通用户部分。查找我们写完了。
4.6、BorrowOperation
这里我们唯一要注意的地方就是查找到图书后将book.setBorrowed()里面写true这样就借阅成功了。我们来看代码:
package Operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOPeration{@Overridepublic 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); // 默认书是falseif(book.getName().equals(name) && !book.isBorrowed() ) {book.setBorrowed(true);System.out.println("借阅成功");return;}}}
}
4.7、ReturnOperation
归还和借书最大的区别在于最后,其他几乎一样,如下所示:
package Operation;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOPeration{@Overridepublic 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); // 默认书是falseif(book.getName().equals(name) && book.isBorrowed() ) {book.setBorrowed(false);System.out.println("归还成功");return;}}}
}
4.8、ExitOperation
退出部分作为最后一步,同时也是两种身份共同的功能。与C语言不同的是,Java退出系统是很简单的,如下:
package Operation;import book.BookList;public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出系统!");System.exit(0);}
}
五、main
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login() {//这里面下面的返回值都是new...类型我们就写他们的父类System.out.println("请输入你的名字:"); // void没有返回值不行的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);}}
}
这样子这个图书管理系统我们就写完了。我们来看看运行结果
管理员:
普通用户:
总结:这样我们就完成了一个图书管理系统。实现了几个基本的功能。这就是一个图书管理系统了。