目录
一、基本思路
1.1 确定图书管理系统的使用人群及功能
1.2 确定如何放置图书信息、操作和使用者
在book包中可以放Book类和BookList类,Book类中可以定义书拥有的属性,例如:书名、作者等,BookList类可以将它想象为1个书架,通过它可以知道存放书的信息和数量,以及实现取书和放书;
在Do包中主要是实现图书管理的几种操作,有增加图书类、借书类、删除书类、查询书类、归还书类、展示书信息类、退出系统类,还包括一个Do接口,其他操作可以实现这个接口具体操作。
在User包中可以放User类、Consumer类和Manager类,Consumer类中存放普通用户的操作菜单和实现输入下标调用下标对应普通用户的操作,Manager类中存放管理者的操作菜单和实现输入下标调用下标对应管理者的操作,Consumer类和Manager类继承于User类,具体实现User类中的方法。
在Main包中可以放Main类,在Main类中可以定义管理系统的输出界面。
二、Book包中具体代码实现
2.1 Book类
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 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 "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", 是否借出: " + ((isBorrowed==true)?"已被借出":"未被借出") +
'}';
}
}
①在Book类中,定义了书的5个属性:书名、作者、价格、类型、是否借出,定义的5个属性访问权限为private,需要写属性对应的getxxx和setxxx方法;②在定义Book类的构造方法时,默认定义的书都还未被借出,所以初始化书时只需要初始化4个参数:书名、作者、价格、类型;③考虑到要打印书的具体内容,重写了tostring方法,需要注意的是对于是否借出的打印需要做判断,结果为false时该书未被借出,结果为true时该书被借出。
2.2 BookList类
package book;
public class BookList {
private Book books[];
private int UseSize; //已有书的数量
private static final int a=10; //书架能放书的数量
public BookList(){
this.books=new Book[a]; //存放书
this.books[0]=new Book("三国演义","罗贯中",20,"小说");
this.books[1]=new Book("西游记","吴承恩",18,"小说");
this.books[2]=new Book("红楼梦","曹雪芹",22,"小说");
this.UseSize=3;
}
public int getUseSize() {
return UseSize;
}
public void setUseSize(int useSize) {
UseSize = useSize;
}
public Book[] getBooks() { //获取书架
return books;
}
public Book getbook(int pos){ //根据下标获取书籍
return books[pos];
}
public void setbook(int pos,Book book){ //根据下标放置书籍
books[pos]=book;
}
}
①BooList类中,定义了Book类型的books数组,该数组中存放现有书的信息,books[0]表示存放的第一本书;定义了UseSize成员变量,表示书架上现有书的数量;定义了a常数变量,表示书架可放书的最大数量;UseSize成员变量的访问权限为private,需要定义getxxx和setxxx方法;books成员变量的访问权限为private,需要定义getxxx方法;②定义BookList类的构造方法时,初始化了3本书和初始化了现有书的数量为3本;③对于books数组,需要获取对应下标的书时,方法中形参为对应下标,返回值为books数组对应下标的内容;需要在数组某位置存放书时,方法中形参为对应下标和存放书的信息,函数体是books数组对应下标的内容等于存放书的信息。
三、Do包中具体代码实现
3.1 Do接口
package Do;
import book.BookList;
public interface Do {
void work(BookList bookList);
}
在Do接口中定义了work方法,形参是BookList类(书架),该接口的作用是其他操作只需要实现这个接口,重写work方法即可,就不用重写定义work方法了。
3.2 Add类
package Do;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Add implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("增加图书!!!");
System.out.println();
System.out.print("你要增加的图书书名:");
Scanner sc=new Scanner(System.in);
String name1= sc.nextLine();
System.out.print("你要增加的图书作者:");
String author1= sc.nextLine();
System.out.print("你要增加的图书类型:");
String type1= sc.nextLine();
System.out.print("你要增加的图书价格:");
double prince1= sc.nextDouble();
Book book=new Book(name1,author1,prince1,type1);
int ret= bookList.getUseSize();
for(int i=0;i<ret;i++){
Book book1=bookList.getbook(i);
if(book1.getName().equals(name1)) {
System.out.println("你要增加的图书已经存在!!!");
return;
}
}
if(ret==bookList.getBooks().length){
System.out.println("书架满了,不能进行存放!!!");
}else{
bookList.setbook(ret,book);
bookList.setUseSize(ret+1);
System.out.println("图书增加成功!!!");
}
}
}
①在增加图书时首先先定义一个书的信息,包括书名、作者、价格、类型;②获取现存书的数量,根据书的数量获取现存书的信息,判断增加的图书是否已经存在,已存在则不增加;③将现存书的数量和书架最大容量比较判断书架是否满了,书架已满不存放书;④以上两种情况不存在时则将书存放在现有数量的下标位置处,并将现存数量+1;需注意的是输入书的信息时,先输入字符型的成员变量,再输入数据型的成员变量;
3.3 Borrow类
package Do;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Borrow implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("借阅图书!!!");
System.out.println();
System.out.print("请输入你要借阅图书的书名:");
Scanner sc=new Scanner(System.in);
String name1=sc.nextLine();
int ret= bookList.getUseSize();
for(int i=0;i<ret;i++){
Book book=bookList.getbook(i);
if(book.getName().equals(name1)){
book.setBorrowed(true);
System.out.println("你已借阅成功!!!");
return;
}
}
System.out.println("你借阅的图书该图书馆不存在!!!");
}
}
①先输入需要借阅的图书书名;②获取现存书的数量,根据书的数量获取现存书的信息,判断借阅的图书是否存在,不存在无法借阅;③借阅的书籍存在时,将该书的是否借阅成员变量改为true;
3.4 Delete类
package Do;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Delete implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("删除图书!!!");
System.out.println();
System.out.print("请输入你要删除图书的书名:");
Scanner sc=new Scanner(System.in);
String name1=sc.nextLine();
int ret=bookList.getUseSize();
int j,i;
for(i=0;i<ret;i++){
Book book=bookList.getbook(i);
if(book.getName().equals(name1))
{
for(j=i;j<ret-1;j++){
Book book1=bookList.getbook(j+1);
bookList.setbook(j,book1);
}
bookList.setbook(j,null);
bookList.setUseSize(ret-1);
System.out.println("删除成功!!!");
return;
}
}
System.out.println("你要删除的图书该图书馆不存在!!!");
}
}
①先输入需要删除的图书书名;②获取现存书的数量,根据书的数量获取现存书的信息,判断要删除的图书是否存在,不存在无法删除;③删除的书籍存在时,先找到删除图书所处的下标i,获取i+1的图书,将i+1的图书放在i位置处;下标i++,获取i+1的图书,将i+1的图书放在i位置处;重复操作,直到下标i走到书架倒数第二个位置处,将倒数第一位置处的书存放在倒数第二位置处;将倒数第一位置处的书信息置空,将现存书籍数量-1;
3.5 Look类
package Do;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Look implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("查询图书!!!");
System.out.println();
System.out.print("请输入你需要查询图书的书名:");
Scanner sc=new Scanner(System.in);
String name1=sc.nextLine();
int ret= bookList.getUseSize();
for(int i=0;i<ret;i++){
Book book=bookList.getbook(i);
if(book.getName().equals(name1)){
System.out.println(book);
return;
}
}
System.out.println("你查询的图书该图书馆不存在!!!");
}
}
①先输入需要查询的图书书名;②获取现存书的数量,根据书的数量获取现存书的信息,判断查询的图书是否存在,不存在无法查询;③查询的书籍存在时,打印该书的信息;
3.6 Return类
package Do;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class Return implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("归还图书!!!");
System.out.print("请输入你要归还图书的书名:");
System.out.println();
Scanner sc=new Scanner(System.in);
String name1=sc.nextLine();
int ret= bookList.getUseSize();
for(int i=0;i<ret;i++){
Book book=bookList.getbook(i);
if(book.getName().equals(name1)){
book.setBorrowed(false);
System.out.println("你借阅的图书已归还成功!!!");
return;
}
}
System.out.println("你归还的图书该图书馆不存在!!!");
}
}
①先输入需要归还的图书书名;②获取现存书的数量,根据书的数量获取现存书的信息,判断归还的图书是否存在,不存在无法归还;③借阅的书籍存在时,将该书的是否借阅成员变量改为false;
3.7 Show类
package Do;
import book.BookList;
import book.Book;
public class Show implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("展示图书!!!");
System.out.println();
int ret=bookList.getUseSize();
for(int i=0;i<ret;i++) {
Book book = bookList.getbook(i);
System.out.println(book);
}
}
}
获取现存书的数量,根据书的数量获取现存书的信息,打印书的信息;
3.8 Exit类
package Do;
import book.BookList;
public class Exit implements Do{
@Override
public void work(BookList bookList){
System.out.println();
System.out.println("退出系统!!!");
System.out.println();
System.exit(0);
}
}
固定的退出系统模式代码;
四、User包中具体代码实现
4.1 User类
package User;
import Do.Do;
import book.BookList;
public abstract class User {
protected String name;
protected Do[] does; //放操作的数组,顺序和菜单一样
public abstract int menu(); //调用菜单
public User(String name) {
this.name = name;
}
public void doing(int choice, BookList bookList){ //实现操作,根据下标找到相应操作,在booklist中实现
does[choice].work(bookList);
}
}
①User类是一个抽象类,普通用户类和管理员类继承User类,需重写菜单,菜单返回的是选择的数字;②定义了使用者的姓名以及放操作的数组,普通用户类和管理员放操作的数组不同;③定义了User类的构造方法,只有name一个形参;④定义了如何根据下标调用操作的方法,形参有下标和书架,先找到调用的操作,再调用操作中的具体work;
4.2 Manager类
package User;
import Do.*;
import Do.Do;
import java.util.Scanner;
public class Manager extends User{
public Manager(String name) {
super(name);
this.does=new Do[]{
new Exit(),
new Look(),
new Add(),
new Delete(),
new Show(),
};
}
@Override
public int menu() {
System.out.println();
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();
System.out.println("请输入你的选择:");
Scanner sc=new Scanner(System.in);
int choice=sc.nextInt();
return choice;
}
}
①Manager类继承了User类,首先定义了构造方法,并在构造方法中初始化了操作数组;②重写了管理者的菜单,返回值为选择值;
4.3 Consumer类
package User;
import Do.*;
import Do.Do;
import java.util.Scanner;
public class Consumer extends User{
public Consumer(String name) {
super(name);
this.does=new Do[]{
new Exit(),
new Look(),
new Borrow(),
new Return()
};
}
@Override
public int menu() {
System.out.println();
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();
System.out.println("请输入你的选择:");
Scanner sc=new Scanner(System.in);
int choice=sc.nextInt();
return choice;
}
}
①Consumer类继承了User类,首先定义了构造方法,并在构造方法中初始化了操作数组;②重写了普通用户的菜单,返回值为选择值;
五、Main包中具体代码实现
package Main;
import book.BookList;
import User.Manager;
import User.Consumer;
import User.User;
import java.util.Scanner;
public class Main {
public static User log(){
System.out.println("请输入你的姓名:");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
System.out.println("hello"+" "+name+" 请选择你的身份: 1.普通用户 2.管理员 --》");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
if(choice==1){
return new Consumer(name);
}else
return new Manager(name);
}
public static void main(String[] args) {
BookList bookList=new BookList();
User user=log();
while(true) {
int a = user.menu();
user.doing(a, bookList);
}
}
}
①在Main类中先定义了log方法,返回类型是User类型,方法中先要求用户输入姓名,在根据提示进行选择,输入1返回Consumer类型(向上转型),输入2返回Manager类型(向上转型);②在main方法中,先选择用户类型,根据用户类型打印对应的菜单(多态);③调用User类中下标实现操作的方法,输入的选择找到操作,在操作中具体实现;