目录
1.前言
2.初步框架搭建
3.Book 书架和书架里的书
3.1书本
3.2书架
4.User 用户和管理员
4.1初步想法
4.2用户
4.3管理员
4.4main函数中如何调用不同的成员
5.方法的调用
5.1接口
5.2增加图书
5.3借阅图书
5.4删除图书
5.5退出系统
5.6查找图书
5.7归还图书
5.8显示图书
5.9main方法
6.小结
大家好,今天我来带大家使用JavaSE的知识来完成一个简单的图书管理系统。在日常生活中,我们需要各种管理系统来管理我们的一些信息,比如学生管理系统,图书管理系统等。在这些系统中,我们包含了对增删查改等功能。我们将从Java面向对象的特性来庖丁解牛,逐步详细向大家分析。
既然要使用面向对象的语言来设计该系统,我们就得把该系统的主要对象先构思出来。首先我们需要一个书架。来存放和使用我们的图书。然后需要用户或者管理员,对这些书进行操作。当然,这些操作的方法我们也需要一个方法区。以便我们对书架上的书进行正确的操作。
这几个包里面分别存放我们上述所描述的三个对象。接下来我们逐步的在里面加入我们所需要的类,通过面向对象的思想来统筹它们协作完成我们的图书管理系统。
既然我们需要书架,那么书架里也需要我们的书,我们创建两个类,分别是书和书架。
我们首先需要在书这个类里,创建一些成员变量来描述这些书的信息,如书名,作者,价格,类型,状态(是否被借出)等。这些变量我们可以使用private关键字把它们封装起来,并且提供get和set这种公开接口,以便对它们进行操作。为了后续方便打印,我们重写了object类的toString方法。并在我们这个方法里使用三目运算符来进行书的状态判断。
package Book;
public class Book {
private String name;// 书名
private String author; //作者
private double price;//价格
private String type;//类型
private boolean isBorrowed;//状态 (是否被借出)
public Book(String name, String author, double price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
public Book(boolean isBorrowed){
this.isBorrowed=isBorrowed;
}
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 double getPrice() {
return price;
}
public void setPrice(double 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 "书{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + (isBorrowed==true?"已被借阅":"未被借阅" )+
'}';
}
}
拥有了书这个类,我们需要一个书架来存放这些书,并且判断书架里存放了几本书。我们初始可以在书架的构造方法(以便后续的操作)里自定义一些书进行存放。
package Book;
import java.util.Scanner;
public class BookList {
Book[] books=new Book[10];
private int usesize;//查看有多少本书
public BookList(){
books[0]=new Book("三国演义","罗贯中",10.5,"小说");
books[1]=new Book("西游记","吴承恩",18.8,"小说");
books[2]=new Book("水浒传","施耐庵",22.5,"小说");
this.usesize=3;
}
public int getUsesize() {
return usesize;
}
public void setUsesize(int usesize) {
this.usesize = usesize;
}
public Book getBooks(int pos) {
return books [pos];
}
public Book setbooks(int pos,Book book){
return books[pos]=book;
}
public void setBooks(Book book) {
books[this.usesize]=book;
}
}
为了方便我们进行调用不同的成员(用户或者管理员),我想到了使用一个抽象类来当它们的父类,并且让这两个成员继承它。这样我们就可以构成向上转型,使用多态的思想来调用不同的成员了。
package user;
import Book.BookList;
import operation.IoPeration;
public abstract class User {
public User(String name) {
this.name = name;
}
String name;
protected IoPeration[] ioPerations;
public abstract int menu();
public void doWord(int choice, BookList bookList){
ioPerations[choice].work(bookList);
}
}
我们的用户继承了User以后,也要考虑到后续方法的调用,所以我使用一个接口数组用来存放这些方法,这样我就可以使用数组的下标来调用不同的方法了。并且将我们的菜单栏也描述出来。
package user;
import operation.*;
import java.util.Scanner;
public class Normal extends User{
public Normal(String name) {
super(name);
//这个接口数组方便我们调用不同的方法。
this.ioPerations=new IoPeration[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation()
};
}
@Override
public int menu() {
System.out.println("********************");
System.out.println("hello"+this.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;
}
}
与用户的相似。都是通过接口数组来调用不同的方法。并且描述了菜单。
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 Deteperation(),
new ShowOperation(),
};
}
@Override
public int menu() {
System.out.println("********************");
System.out.println("hello"+this.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;
}
}
在初步想法中,我们定义了一个抽象类作为父类。并让这两个子类来继承它。那么我们自然就联想到面向对象中多态的使用,我们通过向上转型的多态来调用不同的成员。
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 Normal(name);
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = login();
在初步定义了User用户和管理员还有Book,书架与书籍以后。我们此时需要一些方法来帮助我们操作这些书籍。我们在前面分析到,如果我们想使用不同的方法,那么就需要一个接口数组来存放继承这个接口数组的方法。通过数组的下标来调用。
package operation;
import Book.BookList;
public interface IoPeration {
void work(BookList bookList);
}
增加图书很简单,我们通过Scanner类把我们需要的增加的书本信息加入到book数组的下一个位置,并且将Usesize+1。当然,为了严谨,我们需要判断一下书架里有没有这本书。
package operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class Addoperation implements IoPeration{
@Override
public void work(BookList bookList) {
System.out.println("新增图书");
int count= bookList.getUsesize();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入书名");
String name=scanner.nextLine();
System.out.println("请输入作者");
String author=scanner.nextLine();
System.out.println("请输入该书的类型");
String tpye=scanner.nextLine();
System.out.println("请输入价格");
double price=scanner.nextDouble();
Book book=new Book(name,author,price,tpye);
int a= bookList.getUsesize();
for (int i = 0; i < a; i++) {
if(bookList.getBooks(i).getName().equals(name)){
System.out.println("已经有这本书了");
return;
}
}
bookList.setBooks(book);
bookList.setUsesize(a+1);
}
}
借阅图书的时候,我们首先要在书架里遍历去判断书架里有没有这本书,然后需要把书的状态改成true即可。
package operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IoPeration{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
for (int i = 0; i < bookList.getUsesize(); i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)&& book.isBorrowed()==false){
System.out.println("借阅成功");
book.setBorrowed(true);
return;
}
}
System.out.println("没有找到这本书");
}
}
通过两次遍历,第一次遍历找到这本书,第二次遍历,把这本书后面的书放到它的位置上,从后往前覆盖,并且将最后一个置为null。
package operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class Deteperation 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 count= bookList.getUsesize();
int index=-1;
for (int i = 0; i < count; i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)){
index=i;
break;
}
}
for (int j = index; j
改操作只需要一行函数即可。
package operation;
import Book.BookList;
public class ExitOperation implements IoPeration{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);
}
}
和前面的方法类似,仅需遍历并且通过我们之前重写的toString方法来打印书的信息即可。
package operation;
import Book.BookList;
import java.util.Scanner;
public class FindOperation 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 count= bookList.getUsesize();
for (int i = 0; i < count; i++) {
if(bookList.getBooks(i).getName().equals(name)){
System.out.println("找到了");
System.out.println(bookList.getBooks(i));
return;
}
}
System.out.println("没有找到这本书");
}
}
和借阅图书很相似。改变一下isBorrowed的布尔值即可。
package operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IoPeration{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
for (int i = 0; i < bookList.getUsesize(); i++) {
Book book=bookList.getBooks(i);
if(book.getName().equals(name)&& book.isBorrowed()==true){
System.out.println("归还成功");
book.setBorrowed(false);
return;
}
}
System.out.println("没有找到这本书");
}
}
遍历并打印书架上的书。
package operation;
import Book.BookList;
import Book.Book;
import java.util.Arrays;
public class ShowOperation implements IoPeration{
@Override
public void work (BookList bookList) {
System.out.println("显示所有书");
for (int i = 0; i < bookList.getUsesize(); i++) {
Book book=bookList.getBooks(i);
System.out.println(book);
}
}
}
我们在调用成员的时候会输入我们所需的操作的数字,并且将这个数字返回给我们的接口数组。通过它来调用不同的方法。因为我们要有很多操作,所以需要while(true)来多步操作
import Book.BookList;
import user.AdminUser;
import user.Normal;
import user.User;
import java.util.Scanner;
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 Normal(name);
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = login();
while (true) {
int choice = user.menu();
user.doWord(choice, bookList);
}
}
}
在做一个图书管理系统的时候,我们首先需要进行一个大的框架的设计。并且具体到每一个对象。使用面向对象的思想,逐步去完成每个类和类中的方法。然后使用我们之前所学到的知识把这些串联起来。