主要分为三个包和一Main方法来进行完成(如图):包下又分成若干个功能来一起实现图书管理系统。
1.book包下的各种类的解析
1.1Book类的分析
package book;
public class Book {
private String name;//书名
private int price;//价格
private String type;//类型
private String author;//作者
private boolean isBorrowed;//是否被借出
public Book(String name, int price, String type, String author) {
this.name = name;
this.price = price;
this.type = type;
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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 String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"书名='" + name + '\'' +
", 价格=" + price +
", 类型='" + type + '\'' +
", 作者='" + author + '\'' +
((isBorrowed==true)?", 被借出":", 未被借出")
+'}';
}
}
其实在Java中有很多快捷方式,你只要把成员变量设计好,然后右键找一个Generate...点击进入,就会出现下面第二图,可以通过第四个Getter and Setter来快速获得函数,还可以重写toString()的方法,最后通过Constructor来快速构造函数,因为boolean默认值为false在构造时就不需要加入。通过这个方法可以很快完成我上面代码(要idea哦)!!!不希望其他函数可以轻易修改我的成员变量,因此设计为private。
1.2BookList类下的分析
package book;
public class BookList {
private int usedSize;
private Book[] books;
public BookList() {
books = new Book[10];
this.books[0] = new Book("三国演义",19,"历史小说","罗贯中");
this.books[1] = new Book("西游记",28,"历史小说","吴承恩");
this.books[2] = new Book("斗罗大陆",32,"科幻小说","唐家三少");
this.usedSize = 3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getBooks(int pos){
return books[pos];
}
public void setBooks(int pos,Book book){
books[pos] = book;
}
public Book[] getBooks(){
return books;
}
}
这个其实是一个书架,而usedSize是来记录有多少本图书,像get和set的usedSize函数可以用上面方法继续使用,而get和set的Book函数则不行,因为你要想存书或者取书是需要不同的参数,而存书想要知道你第几个什么书,而取书只需要书名即可。因为这个可以把它当成书架,所以它的构造函数是无参的,而书架需要的是记录有多少本书和它每个位置的书,最多多少本。
2.user包下各种类的解释
2.1AdminiUser类的分析
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("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;
}
}
因为作为图书管理系统,面对不同的人所产生的菜单都有所不同,因此我们需要分开设计。
2.2NormalUser类的分析
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()
};
}
@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("************");
System.out.println("请选择你的操作:>");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
2.3User类的分析
package user;
import book.BookList;
import operation.IOperation;
public abstract class User{
protected String name;
protected IOperation[] iOperations;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int menu();
public void doOperation(int choice, BookList bookList) {
iOperations[choice].work(bookList);
}
}
因为我们所需要的菜单不同所以我们要抽象一个类出来,在不同需求时进行重写,还有使用了一个函数来归纳我们菜单中里的选择时,接口能正确的去访问概要操作的办法。
3.operation各种类的解析
3.1AddOperation类的解析
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 sz = bookList.getUsedSize();
if(sz==bookList.getBooks().length) {
System.out.println("书架已满不能插入");
return;
}
System.out.println("请输入书名:>");
Scanner scanner = new Scanner(System.in);
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();
Book book = new Book(name,price,type,author);
bookList.setBooks(sz,book);
bookList.setUsedSize(sz+1);
System.out.println("增加成功");
}
}
一定要小心一点,要把价格放在最后来输入,这里少了一个吃回车,如果按上面代码这样子写把价格的顺序提前就会导致记录的信息不正确。
3.2BorrowOperation类的解析
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);
System.out.println("请输入借阅图书的书名:>");
String name = scanner.nextLine();
int i = 0;
int sz = bookList.getUsedSize();
for ( i = 0; i < sz; i++) {
Book book = bookList.getBooks(i);
if(name.equals(book.getName())){
book.setBorrowed(true);
System.out.println("借阅成功");
System.out.println(book);
return;
}
}
if(sz == i) {
System.out.println("没有该书");
}
}
}
比较简单就不解析了。
3.3DelOperation类的解析
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
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 sz = bookList.getUsedSize();
int i = 0;
for( i = 0; i < sz ; i++) {
Book book = bookList.getBooks(i);
if(name.equals(book.getName())){
System.out.println("找到该书");
break;
}
}
if(sz == i){
System.out.println("没有找到该书");
return;
}
int j = 0;
for ( j = i; j < sz-1 ; j++) {
Book book = bookList.getBooks(j+1);
bookList.setBooks(j,book);
}
bookList.setUsedSize(sz-1);
System.out.println("删除成功");
}
}
首先遍历数组找出该目标,因为这里是面向对象,与我们刚学时面向过程有区别要好好看一下,好好的去理解。
3.4ExitOperation类的解析
package operation;
import book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);
}
}
较为简单不解释啦!!!
3.5FindOperation类的解释
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int i = 0;
int sz = bookList.getUsedSize();
for (i = 0; i < sz; i++) {
if(name.equals(bookList.getBooks(i).getName())){
System.out.println("找到该书");
System.out.println(bookList.getBooks(i));
return;
}
}
if(i == sz) {
System.out.println("没有找到该书");
}
}
}
也比较简单自己理解哈!!
3.6ReturnOperation类的解析
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入归还图书的书名:>");
String name = scanner.nextLine();
int i = 0;
int sz = bookList.getUsedSize();
for ( i = 0; i < sz; i++) {
Book book = bookList.getBooks(i);
if(name.equals(book.getName())){
book.setBorrowed(false);
System.out.println("归还成功");
System.out.println(book);
return;
}
}
if(sz == i) {
System.out.println("没有该书");
}
}
}
同BorrowOperation那个类原理几乎一样。
3.7ShowOperation类的解析
package operation;
import book.Book;
import book.BookList;
public class ShowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("展示图书");
int sz = bookList.getUsedSize();
for (int i = 0; i < sz; i++) {
System.out.println(bookList.getBooks(i));
}
}
}
比较简单哈自己理解!!!
3.8IOperation接口的解释
package operation;
import book.BookList;
public interface IOperation {
void work(BookList bookList);
}
这就是连接doOperation的函数之一,对哦Operation通过掉用iOperation[choice]来准确来调用operation包下的各种类,在类中也进行了不同的重写来实现功能
4.Main的实现
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User logn() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的姓名:>");
String name = scanner.nextLine();
System.out.println("请选择 1. 管理员 2. 普通用户");
int choice = scanner.nextInt();
if(choice == 1) {
return new AdminUser(name);
} else {
return new NormalUser(name);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = logn();
while(true) {
int choice = user.menu();
user.doOperation(choice,bookList);
}
}
}
这里主要介绍的是logn(),这个就像你登录时的账号密码一样通过你的选择,进行了一个向上转型(这是一个返回值的向上转型,向上转型三种方法之一)为了让后面好调用子类重写的函数。