文章目录
- 逻辑分析
- 主题框架
- 具体方法
- 添加书籍
- 删除书籍
- 查找书籍
- 借阅书籍
- 归还书籍
- 展示书籍
- 退出系统
- 源码
- User
- NormalUser
- AdmintUser
- Book
- BookList
- IOperation
- AddboookOperation
- DeletbookOperation
- FindbookOperation
- ShowbookOperation
- BorrowbookOperation
- ReturnbookOperation
- ExitOperation
逻辑分析
我们需要完成一个图书管理系统,首先我们要对他的逻辑进行分析,Java是面向对象的语言,那我们的图书管理系统都包含哪些对象呢?既然是图书管理系统,首先我们是不是要有书,既然有书了我们就需要有存放书的书架,我们还需要有用户,这里我们写两类用户,一类是管理员,可以对书架进行管理,一类是普通用户,可以实现借书还书等功能。经过我们的分析,大致的逻辑已经出来了,我们可以通过画图来理清楚我们的思路:
这样我们就可以创建出对应的类与接口:
那么如何将书放入书架呢?我们在书架类中创建一个书类的数组是不是就可以储存书类对象了:
主题框架
首先我们来看看已经完成的图书管理系统是什么样子的:
从上面两个图中我们可以对图书管理系统的框架进行一个分析:
主要有两点:
1、通过我们对身份的选择,打印管理员和普通用户两个不同的菜单
2、再次通过我们的选择,实现对我们所选择的用户的功能的实现
我们先来完成第一个框架,通过我们身份的选择打印不同的用户菜单:
因为不同用户打印的菜单是不一样的,那么我们就可以在父类中写一个抽象方法menu
,那么此时父类User
也应该是抽象的了,子类方法通过重写父类中的menu
实现需要打印的菜单,我们通过创建不同的用户对象去调用对应的menu
就可以实现打印不同的菜单了。
这样我们就使用多态的思想实现了我们的问题1,通过我们对身份的选择,打印管理员和普通用户两个不同的菜单,我们是通过选择判断,创建了不同的子类对象实现向上转型,之后通过这个对象调用打印菜单的方法,因为menu
是抽象方法,而抽象方法不会在父类中实现,会调用对应子类中我们重写的menu
方法,这样我们就完成了需求,打印对应用户菜单。
上面就是管理员用户的menu
的菜单,我们只需要打印菜单就好了,那为什么会有返回值呢?因为我们还需要完成问题2:通过我们的选择,实现对我们所选择的用户的功能的实现。此时menu
返回的是我们第二次的选择——对操作的选择。这里我们依旧是使用多态的思想,我们可以在父类用户类中创建一个IOperation
接口的数组,此时我们不在父类中初始化,在对应的子类中初始化,这样不同的子类中的数组元素可以是不同的,我们把我们的选择choice
当作IOperation
数组的下标,这样就访问到了不同子类中的对应功能。
在两个子类中数组iOperations
的元素是不同的,这样我们就可以调用对应用户的对应功能了。以上这就是我们的主体框架需要完成的两个最重要的点,剩下就只需要我们对对应功能的实现了。
具体方法
添加书籍
输入书籍信息,如果书架中没有此本书,就调用Book
的构造方法,将刚才录入的书籍信息当作参数,构造一本书,再将书放入书架中,并给书架中书的数量加一。
删除书籍
删除书籍值得我们讲一下,首先我们输入需要输入删除书籍的名字,遍历书架中的书,如果书架中当前位置的书,名字与我们需要删除的书籍名称相同,那就进行覆盖,将书架中后一本书覆盖到当前位置,依次类推,最后将书架中书的总数减一,并且将最后一本书的位置,置为null删除就成功了。
查找书籍
输入要查找的书籍名称,遍历书架,找到与我们查找的书籍名字相同的书籍,打印该书籍的信息。
借阅书籍
同样输入书籍名称,遍历书架找到该书籍的信息,判断是否借出,如果没有就借阅成功。
归还书籍
展示书籍
遍历书架,打印每一本书籍的信息即可。
退出系统
源码
大家可以去我的码云里面看,也可以在下面观看: 图书管理系统源码
User
package User;
import Book.BookList;
import Operation.IOperation;
public abstract class User {
protected String name;
protected IOperation[] iOperations;
public User() {
}
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doWork(int choice, BookList bookList) {
this.iOperations[choice].work(bookList);
}
}
NormalUser
package User;
import Book.BookList;
import Operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser() {
}
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new BorrowbookOperation(),
new ReturnbookOperation(),
new FindbookOperation()
};
}
@Override
public int menu() {
System.out.println(" 欢迎 " + name + " 管理员进入系统 ");
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("请输入你需要的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
AdmintUser
package User;
import Book.BookList;
import Operation.*;
import java.util.Scanner;
public class AdmintUser extends User {
public AdmintUser() {
}
public AdmintUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new AddbookOperation(),
new DeletbookOperation(),
new FindbookOperation(),
new ShowbookOperation()
};
}
@Override
public int menu() {
System.out.println(" 欢迎 " + name + " 用户进入系统 ");
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("请输入你需要的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
Book
package Book;
public class Book {
private String name;//书名
private String type;//类型
private String author;//作者
private int price;//价格
private boolean isBorrow;//是否借出
public Book() {
}
public Book(String name, String author, int price, String type) {
this.name = name;
this.type = type;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
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 boolean isBorrow() {
return isBorrow;
}
public void setBorrow(boolean borrow) {
isBorrow = borrow;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
", author='" + author + '\'' +
", price=" + price +
", isBorrow=" + isBorrow +
'}';
}
}
BookList
package Book;
public class BookList {
Book[] books = new Book[20];
private int usedSize;
public BookList() {
books[0] = new Book("三国演义","罗贯中",89,"小说");
books[1] = new Book("西游记","吴承恩",78,"小说");
books[2] = new Book("红楼梦","曹雪芹",49,"小说");
this.usedSize = 3;
}
public Book getBooks(int pos) {
return books[pos];
}
public void setBooks(int pos,Book book) {
books[pos] = book;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
IOperation
package Operation;
import Book.BookList;
public interface IOperation {
void work(BookList bookList);
}
AddboookOperation
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class AddbookOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("添加书籍");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要添加的书籍名字:");
String name = scanner.nextLine();
System.out.println("请输入你要添加的书籍类型:");
String type = scanner.nextLine();
System.out.println("请输入你要添加的书籍作者:");
String author = scanner.nextLine();
System.out.println("请输入你要添加的书籍的价格:");
int price = scanner.nextInt();
int size = bookList.getUsedSize();
for(int i = 0;i < size;i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name)) {
System.out.println("不好意思,您想添加的图书已经存在!");
return;
}
}
Book book = new Book(name,author,price,type);
bookList.setBooks(size,book);
bookList.setUsedSize(size + 1);
System.out.println("添加图书成功!");
}
}
DeletbookOperation
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class DeletbookOperation 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 size = bookList.getUsedSize();
int index = -1;
for(int i = 0;i < size;i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name)) {
index = i;
System.out.println("找到该图书了!");
break;
}
}
if(index == -1) {
System.out.println("没有找到该图书!");
}else {
for(int j = index;j < size - 1;j++) {
Book book = bookList.getBooks(j+1);
bookList.setBooks(j,book);
}
bookList.setUsedSize(size - 1);
bookList.setBooks(size - 1,null);
System.out.println("删除成功!");
}
}
}
FindbookOperation
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class FindbookOperation 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 size = bookList.getUsedSize();
for(int i = 0;i < size;i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name)) {
System.out.println("找到了这本书!");
System.out.println(book);
return;
}
}
System.out.println("不好意思没有找到");
}
}
ShowbookOperation
package Operation;
import Book.Book;
import Book.BookList;
public class ShowbookOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("展示书籍");
int size = bookList.getUsedSize();
for(int i = 0;i < size;i++) {
Book book = bookList.getBooks(i);
System.out.println(book);
}
}
}
BorrowbookOperation
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class BorrowbookOperation 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 size = bookList.getUsedSize();
for(int i = 0;i < size;i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name) &&
!book.isBorrow()) {
book.setBorrow(true);
System.out.println("借阅成功!!");
return;
}
}
System.out.println("对不起没有找到该书籍!");
}
}
ReturnbookOperation
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class ReturnbookOperation 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 size = bookList.getUsedSize();
for(int i = 0;i < size;i++) {
Book book = bookList.getBooks(i);
if(book.getName().equals(name) &&
book.isBorrow()) {
book.setBorrow(false);
System.out.println("归还成功!!");
return;
}
}
System.out.println("对不起没有找到该书籍!");
}
}
ExitOperation
package Operation;
import Book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出程序");
System.exit(0);
}
}