目录
准备工作
首先,我们要做图书管理系统,就应该定义三个包,和Main的类(程序在这里运行)
这三个包分别是关于书的包,关于对书的操作的包,和用户的包
因为使用图书管理系统的人分两类,第一类是图书管理员,第二类是普通用户(来借书的人)
定义完三个包后,就可以在新建类了。
book包
Book类
既然我们是要做图书管理系统,那么必然就会有书,
所以,我们在book这个包里新建一个Book类。
而书的成员变量有书名,作者,价格,类型,还有是否借出等等。
为了增强代码的安全性,我们可以用private修饰来成员变量,
因为成员变量被封装了,所以我们要提供对应的get和set方法
右键鼠标,点Generate,然后点getter和setter,然后全选成员变量,然后点OK
我们就能快速写出对应成员变量的get和set方法。
有了get和set的方法,我们还要记得给Book类提供构造方法 ,
因为成员变量不初始化基本数据类型默认是对应的0值,引用类型是null。
所以就不用初始化isBorrowed变量的,让他默认是false(没被借出的状态)。
鼠标右键,点Generate,然后点第一个
除了isborrowed都选上(长按ctrl来点),然后点OK
就写好构造方法了。
BookList类
既然是图书管理系统,那肯定得有很多本书(只有一本书的话还要图书管理系统干啥?
所以我们要有书架,因此我们定义一个BookList类(书架),用来存放书。
既然书架是一组相同类型(书)的集合,所以我们定义一个Book类的数组books,还是用private修饰。
book的话随便你定义几个元素,我就直接定义成10个元素的book了。
我们一开始可能并不会把书架放满,
所以我们定义一个usedSize来记录书架放了多少本书。
既然usedSize 和 books都是被private修饰的,那同理,我们也可以给他提供get和set方法
跟上面同理,我就不重复了,但是我们需要改一下getBook和setBook方法,不然不好操作
改成这样
毕竟我们只需要一本书而不是一整个书架。
get和set方法就写完了。
同时,我们不要忘记给BookList提供构造方法 。
你想设置几本书就设置几本书,usedSize也改为对应的数量即可。
至此,关于book包的操作大致上就完成了
operation包
我们可以新建一个接口IOPeration,毕竟该包放的都是对书架的操作。
再定义几个类,增加,删除,查找,显示,退出(管理员的权限),借阅,归还(普通用户的权限)。
这几个类都要实现IOPeration这个接口,并重写其work方法。
AddOperation类
直接重写接口的work方法,先把要增加的信息存起来,然后再对BookList进行修改。
FindOperation类
你要找书,一般得依照书名来找书,所以要先把输入的书名存起来,再遍历书架来找书
ShowOperation类
先在Book类重写toString方法,然后遍历书架,直接打印。
重写toString方法:
鼠标右键,点Generate,再点toString
再利用三目操作符来打印是否被借出
BorrowOperation类
复制FindOperation类的方法,然后再修改一下。
将打印书改成将书的isBorrowed改为true
然后返回。
ReturnOperation类
复制BorrowOperation类的方法,修改一下,将true修改成false。
ExitOperation类
DelOperation类
复制FindOperation类的方法,再修改一下,写个循坏从找到的书开始被后一本书覆盖,最后usedSize再减1即可
user包
使用图书管理系统的有两类人,一类是管理员,一类是普通用户,
而大家都是用户,所以我们可以定义一个父类User,
让AdminUser(管理员)和NormalUser(普通用户)继承User。
所以定义三个类
User类
用户有名字,所以我们定义一个name的成员变量
同时,我们也要给User提供构造方法和get和set方法
AdminUser类
因为它继承了User,所以我们在构造方法中也要帮助父类构造。
Normal类
也要帮助父类构造。
Main类
我们可以可以写一个登录的方法,利用User和AdminUser,NormalUser的父子类关系来返回创建的对象,成功向上转型就能发生动态绑定。
因为身份的不同,所以对应的权限也不相同,
因此我们可以在User这个类中写一个menu方法,
再让子类重写menu方法,这样User创建的对象也就能够调用子类的menu方法了。
而父类User的menu方法不需要有具体的实现,所以我们可以用abstract修饰,
从而父类User就变成了抽象类,也得用abstract修饰。
然后在子类中进行方法重写(Ctrl + i)
返回值设置成int而不是void的原因是:要在menu方法内选择操作,因此需要返回int
直接复制粘贴AdminUser的menu方法代码,再稍微修改一下即可
然后回到Main类,写main方法(程序主入口)
首先调用之前写过的login方法,用User接收(向上转型)
要新建一个书架,不然放不了书
再写一个while循环,条件恒为真。
在while循环里调用menu方法
因为我们是用User对象接受的返回值,要与AddOperation建立联系
那我们可以这样做:
1.首先把 对象 存起来
那就可以利用IOPeration和AddOperation的实现关系,在User里建立一个IOPeration的数组。
不能在子类里面定义,因为在子类里定义的话父类就访问不到了。
而子类又继承了父类的成员变量,
所以我们就可以通过子类的构造方法初始化这个ioPeration数组。
2.然后我们得在父类User定义一个doOperation的方法
因为操作是和书架有关的,也和选项有关,所以参数就是BookList 和 int
调用ioPeration数组pos下标的work方法
然后我们回到main方法,用choice接收menu的返回值之后,就可以通过user的doOperation来调用choice下标的方法。
完整代码:
book包的Book类:
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;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
((isBorrowed == true) ? " 已经被借出" : " 未被借出") +
/*", 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 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;
}
}
book包的BookList类:
package book;
//书架
public class BookList {
private Book[] books = new Book[10];
private int usedSize;//记录当前存放多少本书
public BookList() {
this.books[0] = new Book("三国演义", "罗贯中", 78, "小说");
this.books[1] = new Book("西游记", "吴承恩", 83, "小说");
this.books[2] = new Book("红楼梦", "曹雪芹", 87, "小说");
this.usedSize = 3;
}
public Book getBooks(int pos) {
return this.books[pos];
}//返回pos位置的书
public void setBooks(int pos, Book book) {
this.books[pos] = book;
}//将pos位置的书设置成新的书
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
}
operation包的IOPeration接口:
package operation;
import book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
operation包的AddOperation类:
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("新增图书!");
System.out.println("请输入你要新增的书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入你要新增的书的作者:");
String author = scanner.nextLine();
System.out.println("请输入你要新增的书的类型:");
String type = scanner.nextLine();
System.out.println("请输入你要新增的书的价格:");
int price = scanner.nextInt();
int currentSize = bookList.getUsedSize();//得到当前书架中书的数量
//将书放在书架的currentSize的下标处
bookList.setBooks(currentSize, new Book(name, author, price, type));
bookList.setUsedSize(currentSize + 1);//书架的现有书的数量加1
System.out.println("新增成功!");
}
}
operation包的BorrowOperation类:
package operation;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation 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 currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
if (bookList.getBooks(i).getName().equals(name)) {
System.out.println("找到了!");
bookList.getBooks(i).setBorrowed(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("不好意思,你好像没有这本书呢");
}
}
operation包的DelOperation类:
package operation;
import book.BookList;
import java.util.Scanner;
public class DelOperation 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 currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
if (bookList.getBooks(i).getName().equals(name)) {
System.out.println("找到了!");
//将后面的书往前覆盖
for (int j = i; j < currentSize - 1; j++) {
bookList.setBooks(j, bookList.getBooks(j + 1));
}
bookList.setUsedSize(currentSize - 1);
System.out.println("删除成功!");
return;
}
}
System.out.println("不好意思,你好像没有这本书呢");
}
}
operation包的ExitOperation类:
package operation;
import book.BookList;
public class ExitOperation implements IOPeration {
@Override
public void work(BookList bookList) {
bookList.setUsedSize(0);
System.exit(0);//调用命令直接退出
System.out.println("退出系统!");
}
}
operation包的FindOperation类:
package operation;
import book.Book;
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 currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);//找到i下标的书
//进行比较
if (book.getName().equals(name)) {
System.out.println("找到了!");
System.out.println(bookList.getBooks(i));
return;
}
}
System.out.println("不好意思,你好像没有这本书呢");
}
}
operation包的ReturnOperation类:
package operation;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation 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 currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
if (bookList.getBooks(i).getName().equals(name)) {
System.out.println("找到了!");
bookList.getBooks(i).setBorrowed(false);
System.out.println("归还成功!");
return;
}
}
System.out.println("不好意思,你好像没有这本书呢");
}
}
operation包的ShowOperation类:
package operation;
import book.Book;
import book.BookList;
public class ShowOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("显示图书!");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBooks(i);//得到i下标的书
System.out.println(book);//打印
}
}
}
user包中的User类:
package user;
import book.BookList;
import operation.IOPeration;
public abstract class User {
private String name;
public IOPeration[] ioPerations;
public User(String name) {
this.name = name;
}
public void doOperation(int choice, BookList bookList) {
ioPerations[choice].work(bookList);
}
public abstract int menu();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
user包中的AdminUser类:
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()
};
}
@Override
public int menu() {
System.out.println("************************");
System.out.println("hello " + super.getName() + " 欢迎来到管理员菜单!");
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;
}
}
user包中的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(),
new ShowOperation()
};
}
@Override
public int menu() {
System.out.println("************************");
System.out.println("hello " + super.getName() + " 欢迎来到普通用户员菜单!");
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;
}
}
Main类:
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.io.StringReader;
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 input = scanner.nextInt();
if (input == 1) {
return new AdminUser(name);
} else {
return new NormalUser(name);
}
}
public static void main(String[] args) {
User user = login();
BookList bookList = new BookList();
while (true) {
int choice = user.menu();
user.doOperation(choice, bookList);
}
}
}