画结构图理清总体结构
1.先写book类
package book;
public class Book {
private String name;
private String author;
private String type;
private boolean isBorrowed;
public Book() {
}
public Book(String name, String author, String type) {
this.name = name;
this.author = author;
this.type = type;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return author
*/
public String getAuthor() {
return author;
}
/**
* 设置
* @param author
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* 获取
* @return type
*/
public String getType() {
return type;
}
/**
* 设置
* @param type
*/
public void setType(String type) {
this.type = type;
}
/**
* 获取
* @return isBorrowed
*/
public boolean getIsBorrowed() {
return isBorrowed;
}
/**
* 设置
* @param isBorrowed
*/
public void setIsBorrowed(boolean isBorrowed) {
this.isBorrowed = isBorrowed;
}
public String toString() {
return "Book{name = " + name + ", author = " + author + ", type = " + type +", isBorrowed = "+(isBorrowed==true?"已被借出":"未被借出") + "}";
}
}//需要注意的是最后toString的重写,利用三目运算符输出书本是否被借出
2.再写bookList类
public class BookList {
Book[] books=new Book[10];//定义一个Book类型的数组
private int usedsize;//计算多少本书
public BookList() {
books[0]=new Book("三国演义","罗贯中","小说");
books[1]=new Book("西游记","吴承恩","小说");
books[2]=new Book("红楼梦","曹雪芹","小说");
this.usedsize=3;
}//BookList的空参构造方法
public BookList(int usedsize) {
this.usedsize = usedsize;
}//BookList的有参构造方法
public Book getBook(int pos){
return this.books[pos];
}
public void setBook(Book book){
this.books[usedsize]=book;
}
public void setBook(int pos,Book book){
this.books[pos]=book;
}//books数组的getter and setter
public int getUsedsize() {
return usedsize;
}
public void setUsedsize(int usedsize) {
this.usedsize = usedsize;
}//usedsize的getter and setter
}
3.写User类
package user;
import book.BookList;
import opera.Ioperation;
public abstract class User {
protected String name;
protected Ioperation[] ioperations;
//定义一个接口数组,用来存放不同人相同选择对应的方法
public User() {
}
public User(String name) {
this.name = name;//构造方法
}
public abstract int menu();//菜单抽象方法,子类要重写菜单
public void doWork(int choose, BookList bookList){
this.ioperations[choose].work(bookList);//调用不同人对应的方法
}
}
4.写User类的子类AdmiUser
package user;
import opera.*;
import java.util.Scanner;
public class AdmiUser extends User{
public AdmiUser(String name) {
super(name);//继承父类,要先调用父类的构造方法
this.ioperations = new Ioperation[]{
new ExitOperate(),//退出系统的选择是0,放在[0]的位置比较好
new AddOperate(),
new ShowOperate(),
new UpdateOperate(),
new DeleOperate()
};//父类接口数组的调用,放入管理员的工作类
}
@Override
public int menu() {
System.out.println("*******************");
System.out.println("欢迎 "+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 sc=new Scanner(System.in);
int choose=sc.nextInt();
return choose;
}//重写菜单并返回键盘录入用户选择
}
5.写User类的子类NomalUser
package user;
import opera.*;
import java.util.Scanner;
public class NomalUser extends User{
public NomalUser(String name) {
super(name);
this.ioperations=new Ioperation[]{
new ExitOperate(),
new FindOperate(),
new BorrowOperate(),
new ReturnOperate()
};//存放普通用户的选择类
}
@Override
public int menu() {
System.out.println("*******************");
System.out.println("欢迎 "+name+" 登录图书管理系统");
System.out.println("1.查看图书");
System.out.println("2.借出图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("*******************");
System.out.println("请输入你的选择");
Scanner sc=new Scanner(System.in);
int choose=sc.nextInt();
return choose;
}
}
6.Main方法
package user;
import book.BookList;
import java.util.Scanner;
public class Main {
public static User login() {
System.out.println("请输入你的姓名");
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("请输入你的选择 1->管理者 0->普通用户");
int cho = sc.nextInt();
if (cho == 1) {
return new AdmiUser(name);
} else {
return new NomalUser(name);
}
}//写一个登录方法,返回值是User,应用了向上转型知识
public static void main(String[] args) {
BookList booklist = new BookList();//实例化bookList
User user = login();//调用登录方法,选择管理者或者普通用户
while (true) {
int choose = user.menu();
//调用不同人的不同菜单,用choose接收,因为菜单返回choose
user.doWork(choose, booklist);//调用不同人的不同菜单中的不同操作
}
}
}
7.AddOperate添加图书
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("添加图书");
System.out.println("请输入你要添加的图书名字");
Scanner sc=new Scanner(System.in);
int curr=bookList.getUsedsize();
String name=sc.next();
for (int i = 0; i <curr; i++) {
Book book=bookList.getBook(i);
if(book.getName().equals(name)){
System.out.println("已经存在这本书");
return;
}
}//连接接口,重写接口中的方法
System.out.println("请输入作者");
String author=sc.next();
System.out.println("请输入图书类型");
String tpye=sc.next();
Book book=new Book(name,author,tpye);//实例化book,放入一本书
bookList.setBook(book);//把这本书放入书本数组
bookList.setUsedsize(bookList.getUsedsize()+1);//书本数量+1
System.out.println("添加成功");
}
}
8.删除图书
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DeleOperate implements Ioperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
System.out.println("请输入要删除的图书名字");
Scanner sc = new Scanner(System.in);
int curr = bookList.getUsedsize();
int index=-1;//定义一个记号记录要删除的书本对应的下标
String name = sc.next();
for (int i = 0; i < curr; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {//找到名字相同的图书
index=i;//记录要删除的书本对应的下标
break;//找到就结束循环
}
}
for (int j = index; j < curr-1; j++) {
Book book=bookList.getBook(j+1);//找到书本数组的第j+1本书
bookList.setBook(j,book);//把第j+1本书放到j的位置
}
bookList.setUsedsize(curr-1);//把书本数量-1
bookList.setBook(curr-1,null);//把最后一本书(与它前面一本相同)置为null
System.out.println("删除成功");
}
}
9.查看所有图书
package opera;
import book.Book;
import book.BookList;
public class ShowOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("查看图书");
int curr=bookList.getUsedsize();
for (int i = 0; i < curr; i++) {
Book book=bookList.getBook(i);//循环拿出每一本书
System.out.println(book);
}
}
}
10.借出图书
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("借出图书");
System.out.println("请输入你要借的图书");
Scanner sc=new Scanner(System.in);
String name=sc.next();
int curr=bookList.getUsedsize();
for (int i = 0; i < curr; i++) {
Book book=bookList.getBook(i);
if(book.getName().equals(name)&&book.getIsBorrowed()==false){
//找到名字相同的书,并且这本书未被借出
System.out.println("借出成功");
book.setIsBorrowed(true);//修改书本状态未已借出
return;//借出则结束方法
}
}
System.out.println("没有这本书或者书本已经被借出");
}
}
11.归还图书
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("请输入你要归还的图书");
Scanner sc=new Scanner(System.in);
String name=sc.next();
int curr=bookList.getUsedsize();
for (int i = 0; i < curr; i++) {
Book book=bookList.getBook(i);
if(book.getName().equals(name)&&book.getIsBorrowed()==true){
//判断书本是否已经被借出
System.out.println("归还成功");
book.setIsBorrowed(false);//修改书本状态为未借出
return;
}
}
System.out.println("没有这本书");
}
}
12.查找图书
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
System.out.println("请输入你要查找的图书名字");
Scanner sc=new Scanner(System.in);
String findbook=sc.next();
int curr=bookList.getUsedsize();
for (int i = 0; i < curr; i++) {
Book book=bookList.getBook(i);
if(book.getName().equals(findbook)){
System.out.println("找到了这本书");
System.out.println(book);//输出这本书
return;
}
}
System.out.println("没有这本书");
}
}
13.修改图书
package opera;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class UpdateOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("修改图书");
Scanner sc=new Scanner(System.in);
System.out.println("输入书名");
String name=sc.next();
for (int i = 0; i <bookList.getUsedsize(); i++) {
Book book=bookList.getBook(i);//遍历找到这本书
if(book.getName().equals(name)){
System.out.println("输入修改后的书名");
String name1=sc.next();
System.out.println("输入修改后的作者");
String author=sc.next();
System.out.println("输入修改后的类型");
String type=sc.next();
Book book1=new Book(name1,author,type);//实例化一个新的书本
bookList.setBook(i,book1);//把这本书放在找到的那本书的位置,实现替换
System.out.println("修改成功");
return;
}
}
System.out.println("没有此书!!");
}
14.退出系统
package opera;
import book.BookList;
public class ExitOperate implements Ioperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);//正常退出
}
}