[JavaSE]图书管理系统的建立
-
框架的建立
首先需要明确建立的图书管理系统要有什么:
1.要有书 2.要有用户 3.管理员与普通用户的权限与操作
所以我们分别创建三个package:Book、Operation、User
三个package里存放各自对应的对象。接下来按照所需往里面加入类。
-
定义书和书架
<1>Book类–书籍
图书管理自然需要有书,所以我们定义Book类,在Book类中定义基本信息,例如:书名、作者、书价格、书类型、借阅状态等等,通过private关键字进行封装,最后定义代码对其进行获取与填入。
package Book; public class Book { private String name; private String author; private String type; private int price; private boolean isBorrowed; public Book(String name, String author, String type, int price) { this.name = name; this.author = author; this.type = type; this.price = price; } 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 String getType() { return type; } public void setType(String type) { this.type = type; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public boolean isBorrowed() { return isBorrowed; } public void setBorrowed(boolean borrowed) { isBorrowed = borrowed; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", type='" + type + '\'' + ", price=" + price + ", isBorrowed=" + isBorrowed + '}'; } }
定义构造方法、Getting和Setting方法以及重写toString方法,这样就可以对私有的成员变量赋值以及获取,并通过toString方法打印Book的信息,这样对Book的相关操作就完成了。
<2>BookList类–书架
有书自然就有存放书的书架。建立BookList类:
package Book; public class BookList{ private int usedSize;//当前书架上实际存放书的数量 private Book[] books; private static final int DEFAULT_CAPACITY = 10; public BookList() { this.books = new Book[DEFAULT_CAPACITY]; this.usedSize = 0; } public int getUsedSize() { return usedSize; } public void setUsedSize(int usedSize) { this.usedSize = usedSize; } public Book[] getBooks() { return books; } public void setBook(int pos,Book book) { books[pos] = book; } public Book getBook(int pos) { return books[pos]; } }
在此类中,我们定义了usedSize变量来判断书架上实际有多少书;定义数组Book[] book来存放书。在构造方法中,初始化数组(这里我定义数组大小为10,所以最多存放10本书,可以根据自己的需求更改)以及初始化usedSize=0。
-
用户权限与管理员权限
3.1构思
用户分为普通用户和管理员用户,所以创建AdminUser和NormalUser类。因为这两个类中有相同的操作,所以定义User类是管理员和普通用户继承User类,构成向上转型。
User
package User; import Book.BookList; import Operation.IOOperation; public abstract class User { protected String name; protected IOOperation[] ioOperations; public User(String name) { this.name = name; } public abstract int menu(); public void doOperation(int choice, BookList bookList) { ioOperations[choice].work(bookList); } }
我还定义了一个接口
package Operation; import Book.BookList; public interface IOOperation { void work(BookList bookList); }
3.2管理员用户
package User; import Operation.*; import java.util.Scanner; public class AdminUser extends User{ public AdminUser(String name) { super(name); this.ioOperations = new IOOperation[]{ new ExitOperation(), new FindOperation(), new AddOperation(), new DelOperation(), new ShowOperation() }; } @Override public int menu() { 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("============================="); w:{ System.out.println("请选择你的操作:"); Scanner scan = new Scanner(System.in); int choice = scan.nextInt(); while (choice > 4 || choice < 0) { System.out.println("请重新输入!"); break w; } return choice; } return menu(); } }
重写父类的抽象方法menu来创造目录,再在构造方法中根据所写目录来初始对象
当输入的数字不在可选目录中来会跳转来重新输入。
3.3 普通用户
与AdminUser类基本一致,只需更改目录即可
package User; import Operation.*; import java.util.Scanner; public class NormalUser extends User{ public NormalUser(String name) { super(name); this.ioOperations = new IOOperation[]{ new ExitOperation(), new FindOperation(), new BorrwoedOperation(), new ReturnOperation() }; } @Override public int menu() { System.out.println("============================="); System.out.println("1、查找图书"); System.out.println("2、借阅图书"); System.out.println("3、归还图书"); System.out.println("0、退出图书"); System.out.println("============================="); w:{ System.out.println("请选择你的操作:"); Scanner scan = new Scanner(System.in); int choice = scan.nextInt(); while (choice > 3 || choice < 0) { System.out.println("请重新输入!"); break w; } return choice; } return menu(); } }
-
用户与管理员操作的定义
4.1新增图书
package Operation; import Book.BookList; import Book.Book; import java.util.Scanner; public class AddOperation implements IOOperation{ @Override public void work(BookList bookList) { System.out.println("新增图书!"); Scanner scan = new Scanner(System.in); System.out.print("请输入书名:"); String name = scan.nextLine(); System.out.print("请输入作者:"); String author = scan.nextLine(); System.out.print("请输入书籍类型:"); String type = scan.nextLine(); System.out.print("请输入书籍价格:"); int price = scan.nextInt(); Book book = new Book(name, author, type, price); //检测书架是否有此书 int currentSize = bookList.getUsedSize(); for (int i = 0; i < currentSize; i++) { Book book1 = bookList.getBook(i); if (book1.getName().equals(name)) { System.out.println("有这本书了!"); return; } } if (currentSize == bookList.getBooks().length) { System.out.println("书架满了,无法再放入!"); } else { bookList.setBook(currentSize, book); bookList.setUsedSize(currentSize + 1); } } }
分为三种情况:书架已有此书、书架满了以及书架没有此书,需要全部考虑。
4.2删除图书
package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class DelOperation implements IOOperation{ @Override public void work(BookList bookList) { System.out.println("删除图书"); System.out.println("请输入你要删除图书的名称:"); Scanner in = new Scanner(System.in); String name = in.nextLine(); int currentSize = bookList.getUsedSize(); int pos = -1; int i = 0; for (; i < currentSize; i++) { Book book = bookList.getBook(i); if (book.getName().equals(name)) { pos = i; break; } } if (i == currentSize) { System.out.println("没有图书删除!"); return; }else { int j = pos; for (; i < currentSize - 1; j++) { Book book = bookList.getBook(j+1); bookList.setBook(j,book); } bookList.setBook(j,null); bookList.setUsedSize(currentSize-1); } } }
两种情况:书架有此书、书架没有这本书。
当有此书时,让pos等于该书所在下标,然后从此位置开始将后面的内容往前移动,最后usedSize-1;
4.3查找图书
package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class FindOperation implements IOOperation{ @Override public void work(BookList bookList) { System.out.println("查找图书"); Scanner in = new Scanner(System.in); String name = in.nextLine(); int currentSize = bookList.getUsedSize(); //遍历数组查找 for (int i = 0; i < currentSize; i++) { Book book1 = bookList.getBook(i); if (book1.getName().equals(name)) { System.out.println("找到了这本书,信息如下"); System.out.println(book1); return; } } System.out.println("没有找到这本书!"); } }
遍历数组查询,找了就直接return终止,若遍历完了没有就代表没有这本书。
4.4展示图书
package Operation; import Book.BookList; import Book.Book; public class ShowOperation implements IOOperation{ @Override public void work(BookList bookList) { System.out.println("展示所有书籍"); int currentSize = bookList.getUsedSize(); if (currentSize == 0) { System.out.println("暂时没有书籍!"); } for (int i = 0; i < currentSize; i++) { Book book = bookList.getBook(i); System.out.println(book); } } }
有书就遍历数组打印书籍信息,没书就打印没书
4.5借阅图书
package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class BorrwoedOperation implements IOOperation{ @Override public void work(BookList bookList) { System.out.println("借阅图书!"); Scanner in = new Scanner(System.in); System.out.println("请输入你要借阅书籍的名称:"); String name = in.nextLine(); int currentSize = bookList.getUsedSize(); int i = 0; for (; i < currentSize; i++) { Book book = bookList.getBook(i); if (book.getName().equals(name)) { book.setBorrowed(true); System.out.println("借阅成功!"); System.out.println(book); return; } } if (i == currentSize) { System.out.println("没有你要找的图书!"); return; } } }
4.6归还图书
package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class ReturnOperation implements IOOperation{ @Override public void work(BookList bookList) { System.out.println("归还书籍"); System.out.println("请输入你要归还的书籍:"); Scanner in = new Scanner(System.in); String name = in.nextLine(); int currentsize = bookList.getUsedSize(); for (int i = 0; i < currentsize; i++) { Book book = bookList.getBook(i); if (book.getName().equals(name)) { book.setBorrowed(false); System.out.println("归还成功!"); System.out.println(book); return; } } System.out.println("你要归还的书籍不存在!"); } }
4.7退出系统
package Operation; import Book.BookList; public class ExitOperation implements IOOperation{ @Override public 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() { var scan = new Scanner(System.in); System.out.println("请输入你的姓名:"); String name = scan.nextLine(); System.out.println("请选择你的身份:1、管理员 2、用户"); int choise = scan.nextInt(); if (choise == 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 choise = user.menu(); System.out.print("您选择了" + choise + ","); user.doOperation(choise,bookList); } } }
这里只是简单的设置了一个登录,可以自行设置如密码登录、注册等方式的登录方法。
6.总结
写代码的思路其实就是由简入深,先设计一个大致的框架,然后根据面向对象的思想逐步完善各个类。当写完User时可以在Operation各项操作类中放置简单的一条输出语句,运行无误后再对Operation包中的类进行具体的操作。
还有在测试时BookList中放入基本书,如:
public BookList() { this.books = new Book[DEFAULT_CAPACITY]; //放好树!! this.books[0] = new Book("三国演义","罗贯中",10,"小说"); this.books[1] = new Book("西游记","吴承恩",9,"小说"); this.books[2] = new Book("红楼梦","曹雪芹",19,"小说"); this.usedSize = 3; }
这个图书管理系统的缺点也很明显,那就是每次运行里面的内容都会清空,可以写一个文件用来保存,也可以创建一个数据库来保存,这只是一个样本。
简单的设置了一个登录,可以自行设置如密码登录、注册等方式的登录方法。
**6.总结**
写代码的思路其实就是由简入深,先设计一个大致的框架,然后根据面向对象的思想逐步完善各个类。当写完User时可以在Operation各项操作类中放置简单的一条输出语句,运行无误后再对Operation包中的类进行具体的操作。
还有在测试时BookList中放入基本书,如:
```java
public BookList() {
this.books = new Book[DEFAULT_CAPACITY];
//放好树!!
this.books[0] = new Book("三国演义","罗贯中",10,"小说");
this.books[1] = new Book("西游记","吴承恩",9,"小说");
this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");
this.usedSize = 3;
}
```
这个图书管理系统的缺点也很明显,那就是每次运行里面的内容都
会清空,可以写一个文件用来保存,也可以创建一个数据库来保存,这只是一
个样例。